您的位置:首页 > 其它

[最小生成树]Kruskal算法

2015-08-10 15:56 281 查看
接下来看一下Kruskal算法:

Kruskal需要用到并查集,所以编码的复杂度相比prim算法要高一些。该算法按照边的权值顺序从小到大查看一遍,如果不产生圈,就把当前这条边加入到生成树中。kruskal返回的是整棵最小生成树的总权值。

举个例子:



接下来我们介绍如何判断是否产生圈。假设现在要把连接顶点u和顶点v的边e加入生成树中。如果加入之前,u和v不在同一个连通分量里,那么加入e也不会产生圈,反之,如果u和v在同一个连通分量里,那么一定会产生圈。可以使用并查集高效地判断是否属于同一个连通分量。

Kruskal算法在边的排序上最费时,算法的复杂度是O(ElogV)。

struct edge{int u,v,cost;}
bool cmp(const node& e1,const node& e2)
{
return e1.cost < e2.cost;
}
edge G[MAXE];//边
int V,E;//顶点数,边数

//这里省略了并查集的Find(),init()和unit()
//需要自己补上
int kruskal()
{
sort(G,G+E,cmp);
init_union(V); //初始化并查集
int res = 0;
for(int i = 0 ; i < E;i++)
{
edge e = G[i];
if(Find(e.u) != Find(e.v))
{
unite(e.u,e.v);
res += e.cost;
}
}
return res;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: