九度1347孤岛连通工程 --并查集kruskal算法

 1 #include<stdio.h>
 2 #include<algorithm>
 3 using namespace std;
 4 struct edge
 5 {
 6        int start,end,len;
 7        bool operator < (const edge & a)const
 8        {
 9             return len<a.len;
10        }
11 };
12 int f[1010],m,n;
13 void init(){for(int i=1;i<=n;i++)f[i]=i;}
14 int root(int a){while(a!=f[a])a=f[a];return a;}
15 void uniset(int a,int b)
16 {
17      a=root(a),b=root(b);
18      if(a<b)f[b]=a;
19      if(b<a)f[a]=b;
20 }
21 bool sameset(int a,int b)
22 {
23      if(root(a)==root(b))return 1;
24      return 0;
25 }
26 bool connected()
27 {
28      for(int i=2;i<=n;i++)
29      if(root(i)!=root(1))return 0;
30      return 1;
31 }
32 main()
33 {
34       int i,j,k,sum;
35       while(~scanf("%d%d",&n,&m))
36       {
37            edge s[m];
38            sum=0,init();
39            for(i=0;i<m;i++)scanf("%d%d%d",&s[i].start,&s[i].end,&s[i].len);
40            sort(s,s+m);
41            for(i=0;i<m;i++)if(!sameset(s[i].start,s[i].end))uniset(s[i].start,s[i].end),sum+=s[i].len;
42            if(connected())printf("%d\n",sum);
43            else printf("no\n");
44       }
45 }

posted on 2012-10-18 14:16  dokc  阅读(163)  评论(0编辑  收藏  举报

导航