最小生成树之Kruskal算法
来源:互联网 发布:卡盟源码官方最新 编辑:程序博客网 时间:2024/06/04 23:29
问题定义
在一个无向连通图中,如果存在一个连通子图,包含原图所有的顶点和部分边,且这个子图不存在回路,则称这个子图为原图的一个生成树。在所有生成树中,边权之和最小的称为最小生成树。
算法原理
下面从数学上证明Kruskal算法的正确性。
在一个连通图中,任意取部分节点属于集合A,剩余部分节点属于集合B。可以证明,此无向连通图的最小生成树必定包含连通两个集合的权值最小的边。
利用反证法,证明过程如下:
因为最小生成树是连通的,所以,集合A和集合B之间必定存在一条边。假设A、B之间权值最小的边为minE,若最小生成树中连通集合A、B的边为E,其中,E > minE,则,将minE替换E,此最小生成树仍为原图的一个生成树,且其边的权值之和要更小,存在矛盾,因此,原命题得证。
算法过程
Kruskal算法步骤如下:
- 初始每一个节点属于一个集合。
- 将所有的边按照边权递增顺序遍历,若边的两个顶点分属于不同的集合,则将两个集合合并(并查集实现,见上一篇文章)。此边加入最小生成树。
- 将所有边遍历结束,若所有的点同属于一个集合,则最小生成树生成成功,否则,原图不存在最小生成树。
举例如下:
典型应用
http://ac.jobdu.com/problem.php?pid=1024
题目很明显,是典型的最小生成树问题。
我的AC代码如下:
#include <iostream>#include <algorithm>using namespace std;#define MAX 105typedef struct edge{ int s; int e; int cost;}edge;int Tree[MAX] = {0};edge E[MAX];bool cmp(edge a, edge b){ return a.cost < b.cost;}int findRoot(int x){ int tmp = 0; if(Tree[x] == -1) { return x; } else { tmp = findRoot(Tree[x]); Tree[x] = tmp; return tmp; }}int main(){ int i = 0; int n = 0; int m = 0; int a = 0; int b = 0; int sum = 0; int count = 0; while(cin >> n) { if(n == 0) { break; } cin >> m; sum = 0; count = 0; for(i = 0; i < MAX; i++) { Tree[i] = -1; } for(i = 0; i < n; i++) { cin >> E[i].s >> E[i].e >> E[i].cost; } sort(E, E + n, cmp); for(i = 0; i < n; i++) { a = E[i].s; b = E[i].e; a = findRoot(a); b = findRoot(b); if(a != b) { sum = sum + E[i].cost; Tree[a] = b; } } for(i = 1; i <= m; i++) { if(Tree[i] == -1) { count ++; } } if(count <= 1) { cout << sum << endl; } else { cout << "?" << endl; } } return 0;}
0 0
- 最小生成树之Kruskal算法
- 最小生成树之kruskal算法
- 贪心算法之最小生成树Kruskal
- 【算法】最小生成树之Kruskal
- 最小生成树之kruskal算法
- 最小生成树之kruskal算法
- 最小生成树之kruskal算法
- 最小生成树之Kruskal算法
- 最小生成树之kruskal算法
- 最小生成树之kruskal算法
- 最小生成树之kruskal算法
- 最小生成树之Kruskal算法
- 数据结构之最小生成树 Kruskal算法
- 最小生成树之kruskal算法
- 最小生成树之Kruskal算法
- 图算法之最小生成树(Kruskal)
- 最小生成树之kruskal算法
- 图之 最小生成树 Kruskal算法
- 计算机ip地址获取
- Java中volatile关键字
- 在已经有的项目上建立WebService
- [NOIP初赛知识点汇总]
- mysql两表联合查询的四种情况
- 最小生成树之Kruskal算法
- BypassUAC------使用EVENTVWR.EXE和注册表劫持实现“无文件”UAC绕过
- 第八周 项目五--计数的模式匹配
- win7 32位安装Python3.5问题
- 给图片添加倒影
- Hack技巧之属性级hack
- Block定义,记录一下
- 第八周项目三(4)
- [数据库][DB2]数据库对象授权处理