最小生成树模板

https://ac.nowcoder.com/acm/contest/5634/D

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=5e5+10;
 4 int vis[maxn];
 5 int fa[maxn];
 6 struct node
 7 {
 8     int u,v,w;
 9 }G[maxn];
10 int getf(int u)
11 {
12     if(u==fa[u]) return u;
13     else{
14         fa[u]=getf(fa[u]);
15         return fa[u];
16     }
17 }
18 int match(int u,int v)
19 {
20     int t1=getf(u);
21     int t2=getf(v);
22     if(t1!=t2){
23         fa[t2]=t1;
24         return 0;
25     }
26     return 1;
27 }
28 bool cmp(node t1,node t2)
29 {
30     return t1.w<t2.w;
31 }
32 int main()
33 {
34     int n,m;
35     scanf("%d%d",&n,&m);
36     for(int i=1;i<=m;i++){
37         scanf("%d%d%d",&G[i].u,&G[i].v,&G[i].w);
38     }
39     sort(G+1,G+1+m,cmp);
40     int sum=0;
41     int ans=0;
42     for(int i=1;i<=n;i++) fa[i]=i;
43     for(int i=1;i<=m;i++){
44         int u=G[i].u;
45         int v=G[i].v;
46         if(match(u,v)==0){
47             sum++;
48             ans+=G[i].w;
49         }
50         if(sum>=n-1) break;
51     }
52     printf("%d\n",ans);
53     return 0;
54 }

 

posted @ 2020-05-13 22:16  古比  阅读(134)  评论(0编辑  收藏  举报