安慰奶牛

来源:互联网 发布:网络专科学位证有用吗 编辑:程序博客网 时间:2024/05/01 21:22

安慰奶牛

时间限制: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 71010206301 2 52 3 52 4 123 4 172 5 153 5 64 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;}

0 0
原创粉丝点击