HDU1233还是畅通工程(并查集+Kruskal)

这道题比1232多了一个条件就是距离,也就是边的权值,建议参考Kruskal算法http://baike.baidu.com/view/247951.htm

思想就是以前做题所用的贪心思想

附代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include <algorithm>
 4 #define max(a,b) (a)>(b)?(a):(b)
 5 #define min(a,b) (a)<(b)?(a):(b)
 6 using namespace std;
 7 
 8 const int MAXN=100 + 5;
 9 const int MAX=5050;
10 int min_len=0;
11 struct bin{int x,y,len;}road[MAX];
12 int p[MAXN];
13 
14 int find(int x)
15 {
16     while(x!=p[x])
17         x=p[x];
18     return x;
19 }
20 
21 int cmp(bin a,bin b)
22 {
23     return a.len<b.len;
24 }
25 void Kruskal(int m)
26 {
27     int i;
28     sort(road,road+m,cmp);
29     for(i=0;i<m;i++)
30     {
31         int a=find(road[i].x),b=find(road[i].y);
32         if(a!=b)
33         {
34             min_len+=road[i].len;
35             p[max(a,b)]=min(a,b);
36         }
37     }
38 }
39 int main()
40 {
41     int n;
42     while(scanf("%d",&n)&&n)
43     {
44         int m=(n*(n-1))/2;
45         min_len=0;
46         int i;
47         for(i=1;i<=n;i++)p[i]=i;
48         for(i=0;i<m;i++)scanf("%d%d%d",&road[i].x,&road[i].y,&road[i].len);
49         Kruskal(m);
50         printf("%d\n",min_len);
51     }
52     return 0;
53 }

 

posted @ 2013-05-27 16:36  再见~雨泉  阅读(213)  评论(0编辑  收藏  举报