求最小生成树的Kruskal算法
2017-12-09 22:27
141 查看
算法导论中求最小生成树的算法一共有两种,一种是Prim算法,一种是Kruskal算法。
Kruskal算法的基本思路是:
step 1 :一个森林,每个顶点是一个树
step 2 :每次添加一条权重最小的边
step 3 :直到所有的顶点连成一个树为止
Kruskal算法的基本框架是:
1. 设置一个集合A 用来存最小生成树的边 集合F用来存储所有的边
2. 从F中选择一个权重最小的边 看是否可以构成一个环
如果形成一个环 将边从F中移出
没有形成一个环 将边从F移动A中
3.直到F为空
问题解决:
1.为了便于每次选择权重最小的环,对边以权重进行排序。
2.看加入边{u,v}之后是否形成环,可以测试u和v是否在一个树中,我们使用不想交集合数据结构(disjoint-set data structure)来判断u和v是否在同一个集合中
即测试find-set(u)=find-set(v)是否成立 Union-Find问题的解决参照http://blog.csdn.net/dm_vincent/article/details/7655764 为了提高在使用find-set(u)和union(u,v)的时间复杂度,我们集合以树的形式来存储,如下图所示,属于同一集合的节点都指向这个树的根节点,
![](https://img-blog.csdn.net/20171209221259051?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzI2Mzg5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
create-set(x) x.parent<-x;
find-set(x) while x不等于x.parent x<-x.parent; end 当把两个点加入到一个集合时,我们使用这样的方式: u所在的树的高度是h(u), v所在的树的高度是h(v) (1)如果h(u)<h(v),则u的根节点指向v的根节点 (2)h(u)=h(v) u的根节点指向v的根节点 h(v)++ (3)如果h(u)>h(v),则u的根节点指向u的根节点 union(x,y):
![](https://img-blog.csdn.net/20171209222306036?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzI2Mzg5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
以下是Kruskal算法的时间复杂度和伪代码
![](https://img-blog.csdn.net/20171209222527020?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzI2Mzg5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
总的时间复杂度为O(|E|log|V|).
Kruskal算法的基本思路是:
step 1 :一个森林,每个顶点是一个树
step 2 :每次添加一条权重最小的边
step 3 :直到所有的顶点连成一个树为止
Kruskal算法的基本框架是:
1. 设置一个集合A 用来存最小生成树的边 集合F用来存储所有的边
2. 从F中选择一个权重最小的边 看是否可以构成一个环
如果形成一个环 将边从F中移出
没有形成一个环 将边从F移动A中
3.直到F为空
问题解决:
1.为了便于每次选择权重最小的环,对边以权重进行排序。
2.看加入边{u,v}之后是否形成环,可以测试u和v是否在一个树中,我们使用不想交集合数据结构(disjoint-set data structure)来判断u和v是否在同一个集合中
即测试find-set(u)=find-set(v)是否成立 Union-Find问题的解决参照http://blog.csdn.net/dm_vincent/article/details/7655764 为了提高在使用find-set(u)和union(u,v)的时间复杂度,我们集合以树的形式来存储,如下图所示,属于同一集合的节点都指向这个树的根节点,
create-set(x) x.parent<-x;
find-set(x) while x不等于x.parent x<-x.parent; end 当把两个点加入到一个集合时,我们使用这样的方式: u所在的树的高度是h(u), v所在的树的高度是h(v) (1)如果h(u)<h(v),则u的根节点指向v的根节点 (2)h(u)=h(v) u的根节点指向v的根节点 h(v)++ (3)如果h(u)>h(v),则u的根节点指向u的根节点 union(x,y):
以下是Kruskal算法的时间复杂度和伪代码
总的时间复杂度为O(|E|log|V|).
相关文章推荐
- 最小生成树-Prim算法和Kruskal算法
- 最小生成树(Minimum Spanning Tree)(Kruskal算法)
- 最小生成树—Prim算法和Kruskal算法 (理解)
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)
- USACO-Section3.1 Agri-Net【最小生成树(Prim算法或Kruskal算法)】
- 最小生成树——Kruskal算法(C语言版)
- Kruskal算法最小生成树(MST)
- 最小生成树-Prim算法和Kruskal算法
- Prim算法和Kruskal算法(最小生成树)
- 关于最小生成树的Prim算法和Kruskal算法
- hdu1233 还是畅通工程 最小生成树(kruskal算法)
- hdu 畅通工程再续(最小生成树)(Prim算法 && Kruskal算法)
- 最小生成树Kruskal算法实现+快排实现权值排序
- 权重最小生成树的思想与Kruskal算法
- hdu 3371 Connect the Cities 最小生成树(kruskal算法)
- 最小生成树的Prim和Kruskal算法
- 最小生成树 kruskal算法 归纳
- 最小生成树之Kruskal算法
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)
- 【转】最小生成树——Kruskal算法