最小生成树Kruskal ADT

 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 }

 

posted @ 2018-03-23 14:42  摇啊摇啊  阅读(108)  评论(0编辑  收藏  举报