最小生成树模板
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 }