[HDU 1233] 还是畅通工程

还是畅通工程

Time Limit: 4000/2000 MS (Java/Others)

Memory Limit: 65536/32768 K (Java/Others)

Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最小的公路总长度。
Sample Input
3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0
Sample Output
3 5
Hint
Huge input, scanf is recommended.
【题解】最小生成树kruskal裸题。复习一下kruskal
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int pre[100010],n,m,ans=0;
 4 struct edge {
 5     int a,b,w;
 6 }e[100010];
 7 int cnt=0;
 8 int cmp(const void *i, const void *j) {
 9     struct edge *c= (struct edge*) i;
10     struct edge *d= (struct edge*) j;
11     return c->w - d->w;
12 }
13 int getf(int x) {
14     int r=x;
15     while(r!=pre[r]) r=pre[r];
16     int i=x,j;
17     while(i!=r) {
18         j=pre[i];
19         pre[i]=r;
20         i=j;
21     }
22     return r;
23 }
24  
25 int main() {
26     while(~scanf("%d",&n)&&n) {ans=0;
27         m=n*(n-1)/2;
28         for (int i=1;i<=m;++i) 
29             scanf("%d %d %d",&e[i].a,&e[i].b,&e[i].w);
30         qsort(e+1,m,sizeof(struct edge),cmp);
31         for (int i=1;i<=n;++i) pre[i]=i;
32         int fa,fb;cnt=0;
33         for (int i=1;i<=m;++i) {
34             fa=getf(e[i].a);
35             fb=getf(e[i].b);
36             if(fa!=fb) {
37                 pre[fa]=fb;
38                 ans+=e[i].w;
39                 cnt++;
40                 if(cnt==n-1) break;
41             }
42         }
43         printf("%d\n",ans);
44         ans=0;
45     }
46     return 0;
47 }
View Code

 

 

posted @ 2015-06-24 21:29  TonyFang  阅读(548)  评论(0编辑  收藏  举报