魔法宝石
来源:互联网 发布:制作招生简章的软件 编辑:程序博客网 时间:2024/04/28 23:26
题目描述
小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,c≤n),表示一个第a种宝石和第b种宝石,可以合成一个第c种宝石。
输出
每组数据输出一行n个数,其中第i个数表示合成第i种宝石的魔力值最小花费。
样例输入
1
3 1
1 1 10
1 2 3
样例输出
1 1 2
本题回溯,如果合成的宝石花费会减小那么就不断往回更新以该宝石为材料能合成的宝石
#include<bits/stdc++.h>using namespace std;int b[100010];vector<int>a[100010];//a[i]保存以i为材料的魔法,偶数是另一个作为材料得宝石,奇数是合成的宝石void ss(int C)//更新以C为材料的宝石{ for(int i=0;i<a[C].size();i+=2) { int h=a[C][i],j=a[C][i+1]; if(b[j]>b[h]+b[C])//判断是否应该更新 { b[j]=b[h]+b[C]; //printf("%d*\n",j); ss(j); } } return;}int main(){ int T; scanf("%d",&T); while(T--) { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&b[i]); while(m--) { int A,B,C; scanf("%d%d%d",&A,&B,&C); a[A].push_back(B);//保存魔法 a[A].push_back(C); a[B].push_back(A); a[B].push_back(C); if(b[C]>b[A]+b[B]) { b[C]=b[A]+b[B]; for(int i=0;i<a[C].size();i+=2) { int h=a[C][i],j=a[C][i+1]; if(b[j]>b[h]+b[C]) { b[j]=b[h]+b[C]; ss(j); } } } } printf("%d",b[1]); a[1].clear(); for(int i=2;i<=n;i++) printf(" %d",b[i]),a[i].clear();//清空动态数组 printf("\n"); }}
0 0
- 魔法宝石
- 魔法宝石
- 魔法宝石 spfa
- HAUTOJ 1262 魔法宝石
- hautoj1262: 魔法宝石
- 【haut 1262: 魔法宝石】+ 暴力
- HAUT校赛 魔法宝石 暴力
- HAUTOJ 1262: 魔法宝石 24行代码
- 魔法宝石(思维啊……)
- hautoj 1262 魔法宝石【最短路】
- HAUTOJ 1262魔法宝石 优先队列
- 魔法宝石(类似dp 杭电排位赛-2)
- 1262: 魔法宝石 (“玲珑杯”河南工业大学ACM程序设计大赛)
- 河南工业大学2017校赛 C 魔法宝石【最短路变形】
- haut 1262: 魔法宝石(dij+堆优化)@
- 2017河南工业大学校赛 C 魔法宝石
- HAUT 1262 魔法宝石 (最短路变形 or 暴力)
- 河南工业“玲珑杯” 魔法宝石(spfa或者暴力)
- 关于表空间及数据文件的offline与online
- UIViewContentMode各类型效果
- Android如何修改使用默认使用GPS提供时间
- JAVA-8-常用API
- conda管理工具
- 魔法宝石
- 考试篇(5.2) NSE4 题库 03. 策略 ❀ 飞塔 (Fortinet) 网络安全专家
- Java父类取得子类传递的泛型参数Class类型
- 解析html中链接url,并下载在指定目录
- MVP实战心得(四)---封装优化,拆分Toolbar与ContentView
- 51nod_1005 大数加法
- Linux启动流程以及初始化
- 计数dp
- 奇葩问题