克鲁斯卡尔总结

来源:互联网 发布:php cookie设置 编辑:程序博客网 时间:2024/04/28 20:47

克鲁斯卡尔算法,是为了用来解决最小生成树问题的。同样功能的还有prim算法。但是由于克鲁斯卡尔的代码短小精悍,运算效率又高。所以经常被用来求最小生成树。

下面我个人对克鲁斯卡尔算法进行下总结。算法的第一步是把所有的边权从小到大进行排列。,接着是对于每条边(u,v)(u,v分别是这条边的两个端点的标号).无非是会出现下边两种情况。

 1:u,v在同一个连通分量中,那么链接u,v会产生环。所以不能连接。

2:u,v不子啊同一个联通分量 中。那么u,v的边一定属于最小生成树的。

下边是伪代码

 把所有的边排序记第i小的边是 e[i](1<=i<m)//m为边的个数

初始化MST

初始化连通分量。每个节点独立成为一个连通分量。

for(int i=0;i<m;i++)

{

     if(e[i] ,u.和v不再同一个联通分量中)

{

    把e[i]加入MST

   合并u,v所在的连通分量

}

}

例子:点u[i]。v[i]所组成的边的边权是 w[i],r[i] 表示第i大的边的编号。

bool cmp(int i,int j){ return  w[i]<w[j];}

int find(x){  return p[x]==x?x:p[x]=find(p[x]);}

int kruskal()

{

    int ans=0;

   for(i=0;i<n;i++) p[i]=i;

   for(i=0;i<m;i++) r[i]=i;

   sort(r,r+m,cmp);

    for(i=0;i<m;i++)

   {

        int e=r[i];

    int aa=find(u[e]);

    int bb=find(v[e]);

     if(aa!=bb){

        ans+=w[e]; p[aa]=bb;

     }

    }

return ans;

}




原创粉丝点击