1 #define N 100010 2 int m,n;int p[N],r[N],w[N];int u[N],v[N]; 3 int cmp(int i,int j){return w[i]<w[j];} //间接排序函数! 4 int find(int x){return p[x]== x ? x:p[x]=find(p[x]);} //并查集的find,寻找结点x的父节点。 5 int Kruskal(){ 6 int ans=0; 7 for(int i=0;i<n;i++) p[i]=i; //初始化并查集 8 for(int i=0;i<m;i++) r[i]=i; //初始化边序号,便于间接排序!之后第i小的边序号保存在r[i]中 9 sort(r,r+m,cmp);//给边排序 10 for(int i=0;i<m;i++){ 11 int e=r[i]; 12 int x=find(u[e]);int y=find(v[e]); //找出当前边两个端点所在集合的编号! 13 if(x!=y){ 14 ans += w[e]; p[x]=y; //如果不在同一集合中,合并! x合并到y下,成为y的子树 15 } 16 } 17 return ans; //ans即为最终最小生成树的权值! 18 }