hihocoder1098---最小生成树二Kruscal算法
//并查集---路径压缩(非递归版)--ref算法笔记 //边贪心思想 //用树的性质V-1==E控制循环提前跳出break #include<bits/stdc++.h> using namespace std; const int N=100010; const int M=1000010; struct edge{ int u;int v; int w; }; edge E[M]; int n,m; int father[N]; void ufs_init(int n){ for(int i=1;i<=n;i++){ father[i]=i; } } int finddad(int x){ int a=x; while(x!=father[x]){ x=father[x]; } while(a!=father[a]){ int z=a; a=father[a]; father[z]=x; } return x; } bool cmp(edge a,edge b){ return a.w<b.w; } int Kruskal(int n,int m){ ufs_init(n); int ans=0;int Num_edge=0; sort(E,E+m,cmp); for(int i=0;i<m;i++){ int u=E[i].u; int v=E[i].v; int w=E[i].w; int fu=finddad(u); int fv=finddad(v); if(fu!=fv){ father[fu]=fv; ans+=w; Num_edge++; if(Num_edge == n-1) break; } } if(Num_edge != n-1) return -1; else return ans; } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ for(int i=0;i<m;i++){ scanf("%d%d%d",&E[i].u,&E[i].v,&E[i].w); } int ans=Kruskal(n,m); printf("%d\n",ans); } return 0; }