【洛谷 p3366】模板-最小生成树(图论)

题目:给出一个无向图,求出最小生成树,如果该图不连通,则输出orz。

解法:Kruskal求MST。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 const int N=5010,M=200010;
 9 int fa[N];
10 struct edge{int x,y,d;}a[M];
11 
12 int ffind(int x)
13 {
14     if (fa[x]!=x) fa[x]=ffind(fa[x]);
15     return fa[x];
16 }
17 bool cmp(edge x,edge y) {return x.d<y.d;}
18 int main()
19 {
20     int n,m;
21     scanf("%d%d",&n,&m);
22     int x,y,d;
23     for (int i=1;i<=m;i++)
24       scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].d);
25     sort(a+1,a+1+m,cmp);
26     for (int i=1;i<=n;i++) fa[i]=i;
27     int sum=0,cnt=0;
28     for (int i=1;i<=m;i++)
29     {
30       int x=a[i].x,y=a[i].y;
31       int xx=ffind(x),yy=ffind(y);
32       if (xx!=yy)
33       {
34         fa[xx]=yy;
35         sum+=a[i].d;
36         cnt++;
37         if (cnt==n-1) break;
38       }
39     }
40     if (cnt==n-1) printf("%d\n",sum);
41     else printf("orz\n");
42     return 0;
43 }

 

posted @ 2016-11-17 15:32  konjac蒟蒻  阅读(189)  评论(0编辑  收藏  举报