HDU 1233 还是畅通工程(模板——克鲁斯卡尔算法)

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1233

题意描述:

输入n个城镇以及n*(n-1)/2条道路信息

计算并输出将所有城镇连通或者间接连通需要修建的最短道路的总长度

解题思路:

最小生成树问题模板题,使用克鲁斯卡尔算法即可。

AC代码:

 1 #include<stdio.h>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 struct edge
 6 {
 7     int u,v,w;
 8 };
 9 struct edge e[100010];
10 int cmp(struct edge x,struct edge y)
11 {
12     return x.w < y.w;
13 }
14 int f[1000];
15 int merge(int u,int v);
16 int getf(int u);
17 int main()
18 {
19     int i,n,m,sum,count;
20     while(scanf("%d",&n),n != 0)
21     {
22         m=n*(n-1)/2;
23         for(i=1;i<=m;i++)
24             scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
25         sort(e+1,e+m+1,cmp);
26         for(i=1;i<=n;i++)
27             f[i]=i;
28         count=0;
29         sum=0;
30         for(i=1;i<=m;i++)
31         {
32             if( merge(e[i].u,e[i].v) )
33             {
34                 count++;
35                 sum += e[i].w;
36             }
37             if(count==n-1)
38             break;
39         }
40         printf("%d\n",sum);
41     }
42     return 0;
43 }
44 int  merge(int u,int v)
45 {
46     int t1,t2;
47     t1=getf(u);
48     t2=getf(v);
49     if(t1 != t2)
50     {
51         f[t2]=t1;
52         return 1;
53     }
54     return 0;
55 }
56 int getf(int u)
57 {
58     if(f[u]==u)
59     return u;
60     else
61     {
62         f[u]=getf(f[u]);
63         return f[u];
64     }
65 }

 

posted @ 2017-08-15 15:15  Reqaw  阅读(225)  评论(0编辑  收藏  举报