A

来源:互联网 发布:淘宝买家怎么实名认证 编辑:程序博客网 时间:2024/06/06 04:53

点击打开链接


A - 还是畅通工程

 


某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。 
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。 
当N为0时,输入结束,该用例不被处理。 
Output
对每个测试用例,在1行里输出最小的公路总长度。 
Sample Input
31 2 11 3 22 3 441 2 11 3 41 4 12 3 32 4 23 4 50
Sample Output
35          Huge input, scanf is recommended.
Hint
Hint


#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;int n,s[5006];struct R{int a,b,c;}p[5006];int find(int x){return s[x] == x ? x : s[x] = find(s[x]);}void join(int x,int y){int fx=find(x);int fy=find(y);if(fy!=fx){s[fy]=fx;}}bool cmp(R a,R b){return a.c<b.c;}int main(){while(scanf("%d",&n)!=EOF&&n){int money=0;for(int i=1;i<=n*(n-1)/2;i++)scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].c);sort(p+1,p+n*(n-1)/2+1,cmp);for(int i=1;i<=105;i++)s[i]=i;for(int i=1;i<=n*(n-1)/2;i++){if(find(p[i].a)!=find(p[i].b)){join(p[i].a,p[i].b);money+=p[i].c;}}printf("%d\n",money);//printf("%d\n",money);}return 0;}



原创粉丝点击