安慰奶牛
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
Farmer John最近变得非常懒,他不想再继续维护供奶牛通行的道路。这些道路被用来连接N个牧场,牧场编号为1到N。每一个牧场是一个奶牛的家。FJ计划除去M条道路中尽可能多的道路,但是还要保持牧场之间的连通。因为奶牛们的交通系统被破坏了,所以她们非常伤心,于是,FJ决定去安慰她们。现在已知每条道路的起点S和终点E(1 <= S <= N,1 <= E <= N,S != E),以及走完这条路需要的时间L。当FJ到达第i个牧场的时候(即使已经到过),他必须花去Ci的时间和奶牛交谈。在早上出发和晚上回去的时候,他都需要和他所在牧场的奶牛交谈一次。假设一天可以谈完,谈完后必须回到早上出发的点(出发点可以任意选择),这样才算完成他的交谈任务。FJ想知道安慰所有的奶牛至少需要多长的时间,聪明的你能告诉他吗?
-
输入
-
多组测试数据。
对于每组数据,第1行包含两个整数N和M。
接下来N行,每行包含1个整数Ci(1<=Ci<=1000)。
接下来M行,每行包含三个整数S, E和L(1<=L<=1000)。
输出
- 输出一个整数, 表示所需要的总时间(包含和在你所在的牧场的奶牛的两次谈话时间)。 样例输入
-
5 7 10 10 20 6 30 1 2 5 2 3 5 2 4 12 3 4 17 2 5 15 3 5 6 4 5 12
样例输出
-
176
#include <stdio.h> #include <algorithm> using namespace std; struct KK{ int S; int E; int L; }road[100010]; int C[10010],father[10010]; int cmp(KK x,KK y){ return x.L<y.L; } int findfather(int x){ if(x!=father[x]) father[x]=findfather(father[x]); return father[x]; } int main(){ int N,M; while(~scanf("%d%d",&N,&M)){ int s,min=100000,t; for(int i=1;i<=N;i++){ scanf("%d",&C[i]); if(min>C[i]) min=C[i]; } for(int i=1;i<=M;i++){ scanf("%d%d%d",&road[i].S,&road[i].E,&t); road[i].L=2*t+C[road[i].E]+C[road[i].S]; } sort(road+1,road+M+1,cmp); // for(int i=1;i<=M;i++) // printf("%d %d %d\n",road[i].S,road[i].E,road[i].L); int result=0; for(int i=1;i<=N;i++) father[i]=i; for(int i=1;i<=M;i++){ int x=findfather(road[i].S); int y=findfather(road[i].E); if(x!=y){ result+=road[i].L; father[x]=y; // printf("%d %d %d %d %d \n",result,x,y,road[i].S,road[i].E); } } printf("%d\n",min+result); } return 0; }
-
多组测试数据。