问题 C: 魔法宝石

题目描述

小s想要创造n种魔法宝石。小s可以用ai的魔力值创造一棵第i种魔法宝石,或是使用两个宝石合成另一种宝石(不消耗魔力值)。请你帮小s算出合成某种宝石的所需的最小花费。

输入

第一行为数据组数T(1≤T≤3)。
对于每组数据,首先一行为n,m(1≤n,m≤10^5)。分别表示魔法宝石种类数和合成魔法的数量。
之后一行n个数表示a1到an。(1≤ai≤10^9)。a_i表示合成第i种宝石所需的魔力值。
之后n行,每行三个数a,b,c(1≤a,b,cn),表示一个第a种宝石和第b种宝石,可以合成一个第c种宝石。

输出

每组数据输出一行n个数,其中第i个数表示合成第i种宝石的魔力值最小花费。

样例输入

13 11 1 101 2 3

样例输出

1 1 2

解题思路:

由于1≤n,m≤10^5,不能直接暴力更新。刚开始想的是用记忆化搜索,当要更新宝石c时,先更新宝石a和宝石b。但这样会出现一个题,如果宝石a也可以有宝石c和宝石b合成时,程序会进入死循环。

那怎么样决定更新的顺序?考虑一种宝石,如果它的价值是当前宝石中最小的,任意两种宝石(值大于0)的和都大于它,那么它就不能再被更新。所以只需要每次取出当前价值最小的宝石,我们用这个宝石去更新别的宝石。等所有的宝石都更新完毕即可。
代码:
#include <iostream>
#include<bits/stdc++.h>using namespace std;
const int N=110000;
struct node
{int num,i;friend bool operator<(const node &a,const node &b){return a.num<b.num;}
}a[N];//第i中宝石和当前合成该宝石的花费vector<pair<int,int> >r[N];//第i种宝石的合成关系
priority_queue<node> q;//维护一个优先队列,每次出队一种花费最小的宝石
int f[N];//合成的最小花费
int main()
{int T;cin>>T;while(T--){int n,m;cin>>n>>m;while(!q.empty())   q.pop();for(int i=1;i<=n;i++){scanf("%d",&a[i].num);a[i].i=i;q.push(a[i]);f[i]=a[i].num;}for(int i=1;i<=n;i++)r[i].clear();for(int i=0;i<m;i++)//记录宝石t1可以和宝石t2合成宝石t3{int t1,t2,t3;scanf("%d%d%d",&t1,&t2,&t3);pair<int,int>p1(t2,t3);r[t1].push_back(p1);pair<int,int>p2(t1,t3);r[t2].push_back(p2);}while(!q.empty()){node t=q.top();q.pop();int t1=t.i;for(int i=0;i<r[t1].size();i++){int t2=r[t.i][i].first;int t3=r[t.i][i].second;if(f[t1]+f[t2]<f[t3])//如果能使宝石t3的花费变小,更新t3,并使其入队{f[t3]=f[t1]+f[t2];node tp;tp.i=t3;tp.num=f[t3];q.push(tp);}}}for(int i=1;i<=n;i++)printf(i==n?"%d\n":"%d ",f[i]);}
}

2017河南工业大学校赛 C 魔法宝石相关推荐

  1. 2017河南工业大学校赛 D rqy的键盘

    问题 D: rqy的键盘 题目描述 rqy在和妹子约会,突然女票打来电话.rqy骗女票他在写代码.女票为了证实,问他键盘上F键左边是哪个键. 你能否帮助rqy回应女票的质问?不然他可就要写思想汇报了. ...

  2. 2016年 河南工业大学校赛 C题.魔法宝石

    魔法宝石 时间限制: 2 秒  内存限制: 64 MB  |  提交: 582  解决: 187 题目描述 小s想要创造n种魔法宝石.小s可以用ai的魔力值创造一棵第i种魔法宝石,或是使用两个宝石合成 ...

  3. HAUT 1262 魔法宝石(spfa)(河南工业大学2017校赛)

    魔法宝石 题目描述 小s想要创造n种魔法宝石.小s可以用ai的魔力值创造一棵第i种魔法宝石,或是使用两个宝石合成另一种宝石(不消耗魔力值).请你帮小s算出合成某种宝石的所需的最小花费. 输入 第一行为 ...

  4. HAUT校赛 魔法宝石 暴力

    问题 C: 魔法宝石 时间限制: 2 秒  内存限制: 64 MB 提交: 505  解决: 149 提交 状态 题目描述 小s想要创造n种魔法宝石.小s可以用ai的魔力值创造一棵第i种魔法宝石,或是 ...

  5. 杭电2017单人排位赛2-B魔法宝石

    Problem Description 小s想要创造n种魔法宝石.小s可以用ai的魔力值创造一棵第i种魔法宝石,或是使用两个宝石合成另一种宝石(不消耗魔力值).请你帮小s算出合成某种宝石的所需的最小花 ...

  6. HAUT 1262 魔法宝石 暴力思想,多种解决方案

    魔法宝石 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  7. 福建农林大学校赛(同步赛)

    福建农林大学校赛(同步赛) 目录 A 派蒙之灵 题目思路 题目代码 B 派蒙家的荧女仆 题目思路 题目代码 C 派蒙的奇妙冒险------石之海 题目思路 题目代码 D 派蒙游戏世界对旅行荧妹很不友好 ...

  8. 魔法宝石(动态规划)

    Bessie 去珠宝商店想要买一些魔法宝石.商店里有 n 个宝石,每个宝石的重量为 wi幸运值为 vi.Bessie 的购物车只能装重量之和不超过 mm 的商品,现在她想知道如何选择宝石,能让购买的幸 ...

  9. 魔法宝石 spfa

    1262: 魔法宝石 时间限制: 2 秒  内存限制: 64 MB 提交: 248  解决: 48 提交 状态 题目描述 小s想要创造n种魔法宝石.小s可以用ai的魔力值创造一棵第i种魔法宝石,或是使 ...

最新文章

  1. 1.2W 字的 SQL 语法速成手册
  2. ASA防火墙学习笔记1-基础篇
  3. debian 开发版 移植_迅雷X Linux版(Debian系通用)
  4. SAP odata get metadata in QHD - still has cache logic
  5. ExtJs6 Desktop Demo 修改测试
  6. (转ORCLE导入导出命令)
  7. 计算机背板知识,你知道背板的选购技巧吗?
  8. “3D几何与视觉技术”全球在线研讨会(9月2日到12月16日)
  9. During a meeting, there was a woman
  10. C语言指针的使用例子(1)指针地址的输出
  11. zabbix监控之模板使用、网络发现及邮件报警功能
  12. matlab 2ask原理,基于Matlab对2ASK调制解调及其仿真设计
  13. 【设计】同步降压型DC-DC转换器驱动电路设计
  14. 遥感图像计算机分类论文,遥感影像和监督分类论文,关于基于监督分类的土地利用遥感影像提取方法相关参考文献资料-免费论文范文...
  15. linux开发之deamon的写法
  16. 利用栈实现中缀表达式转后缀表达式
  17. 用C语言根据出生年月日判断年龄
  18. 【mathtype】将公式左对齐(右对齐)
  19. 清晰的理解大端和小端
  20. nodejs+vue基于决策树算法的大学生就业预测系统

热门文章

  1. PLC模拟量输入 模拟量转换FB S_ITR(三菱FX3U)
  2. 瓦工 -- 叫我怎么相信你
  3. Java快速上手的编程套路
  4. python侯先生爬楼梯_2020 博客之星年度评选【票数排行榜】每日更新
  5. MATLAB boxplot 修改箱子线型、设置箱子颜色、不同长度数据画箱线图、中位线改成黑色、箱线图虚线改实线
  6. beyondcompare连接服务器
  7. android intel x86 性能,英特尔解释安卓与x86兼容问题
  8. 什么才是真正的工程师文化
  9. 从微软下载Windows11操作系统镜像
  10. Linux中的括号用法