HAUTOJ 1262: 魔法宝石 24行代码

来源:互联网 发布:tpshop完整版源码下载 编辑:程序博客网 时间:2024/05/16 10:21

1262: 魔法宝石

时间限制: 2 秒  内存限制: 64 MB
提交: 332  解决: 77
提交 状态 

题目描述

小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,cm),表示一个第a种宝石和第b种宝石,可以合成一个第c种宝石。

输出

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

样例输入

1
3 1
1 1 10
1 2 3

样例输出

1 1 2


观察者这道题首先想到就是让a0[c]=min(a0[c],a0[a]+a0[b])就可以了;但是仔细想想之后会发现可能出现这种情况,例如:a0={10,10,15,1,1},abc分别等于1 2 3;4 5 1;这种情况就要考虑进行a0[c]=min(a0[c],a0[a]+a0[b])的顺序了,但是当顺序非常复杂是就很难通过一遍a0[c]=min(a0[c],a0[a]+a0[b])步骤达到最终结果了,在根据数据量就可以尝试不管顺序,直接多次按输入顺序进行a0[c]=min(a0[c],a0[a]+a0[b])了。

经过尝试,果然经过100次循环后就轻松解决了顺序问题。

#include<bits/stdc++.h>using namespace std;int xxx[100005];//合成宝石的花费int a[100005],b[100005],c[100005];int main() {int T,n,m;int i,j;cin>>T;while(T--) {cin>>n>>m;for(i=0; i<n; i++)cin>>xxx[i];for(i=0; i<m; i++)cin>>a[i]>>b[i]>>c[i];for(j=0; j<100; j++)for(i=0; i<m; i++)xxx[c[i]-1]=min(xxx[c[i]-1],xxx[a[i]-1]+xxx[b[i]-1]);cout<<xxx[0];for(i=1; i<n; i++)cout<<' '<<xxx[i];cout<<endl;}return 0;}



0 0
原创粉丝点击