最小生成树------Kruskal算法
Kruskal最小生成树算法的概略描述:
1 T=Φ;
2 while(T的边少于n-1条) {
3 从E中选取一条最小成本的边(v,w);
4 从E中删去(v,w);
5 if((v,w)在T中不生成环) {
6 将(v,w)加到T中;
7 else{舍弃(v,w);}
8 };//if
9 }//for
为了有效地执行第5和第6步,G中的结点的组合方式应该是易于确定结点v和w是否已由早先选择的边所连通的那种。在已连通的情况下,则将边(v,w)舍弃;若不连通,则把(v,w) 加人到T。一种可能的组合方法是把T的同一连通分图中所有结点放到一个集合中(T的各个连通分图都是树)。那么,T中的两个结点是连通的,当且仅当它们在同一个集合中。例如,当要考虑边(2,6)时,这些集合就是{l,2},{3,4,6}和{5}。结点2和6在不同的集合中,因此这些集合被合并成为{1,2,3,4,6}和{5}。要考虑的下一条边是(1,4)。由于结点1和4在同一个集合中,因此该边被舍弃,边(3,5)连结不同集合中的结点,并且产生最终的生成树。使用集合表示和Union和Find算法,可以在几乎是线性的时间内有效地实现第5和第6行。因此,计算时间由第3行和第4行的时间所确定,在最坏情况下第3和第4行的计算时间是О(eloge)。
举个例子:
Kruskal算法
line void Kruskal (E,COST[],n,T,minCOST) {
//G有n个结点,E是G的边集。COST(u,v)是边(u,v)的成本。
//T是最小成本生成树的边集,minCOST是它的成本
l float minCOST,COST[n][n];
int Parent[n],T[n-][],n
以边成本为元素构造一个min一堆; Parent=l; //每个结点都在不同的集合中
i=minCOST= ;
while(i<n-l) and (堆非空) do
从堆中删去最小成本边(u,v).并重新构造堆
j=Find[u];k=Find[v] ;
if(j!=k) { i=i+;
T[i,l]=u;T(i,)=v;
minCOST = minCOST + COST(u,v);
union(j,k)
}if
}//while
if(i!=n-l) { print(’no spanning tree’)};//if
return T;
}// Kruskal
引理 设T是无向连通图G的一棵生成树。对于任一条边e∈E(G),但不属于E(T),有:①若将e加人到T,则生成一个唯一的环;②从E(T) ∪ {e}中去掉这环中的任意一条边后,剩 余的边构成G的一棵树。
最小生成树------Kruskal算法的更多相关文章
- 【转】最小生成树——Kruskal算法
[转]最小生成树--Kruskal算法 标签(空格分隔): 算法 本文是转载,原文在最小生成树-Prim算法和Kruskal算法,因为复试的时候只用到Kruskal算法即可,故这里不再涉及Prim算法 ...
- 最小生成树——kruskal算法
kruskal和prim都是解决最小生成树问题,都是选取最小边,但kruskal是通过对所有边按从小到大的顺序排过一次序之后,配合并查集实现的.我们取出一条边,判断如果它的始点和终点属于同一棵树,那么 ...
- 最小生成树Kruskal算法
Kruskal算法就是把图中的所有边权值排序,然后从最小的边权值开始查找,连接图中的点,当该边的权值较小,但是连接在途中后会形成回路时就舍弃该边,寻找下一边,以此类推,假设有n个点,则只需要查找n-1 ...
- 求最小生成树——Kruskal算法
给定一个带权值的无向图,要求权值之和最小的生成树,常用的算法有Kruskal算法和Prim算法.这篇文章先介绍Kruskal算法. Kruskal算法的基本思想:先将所有边按权值从小到大排序,然后按顺 ...
- 最小生成树 kruskal算法&prim算法
(先更新到这,后面有时间再补,嘤嘤嘤) 今天给大家简单的讲一下最小生成树的问题吧!(ps:本人目前还比较菜,所以最小生成树最后的结果只能输出最小的权值,不能打印最小生成树的路径) 本Tianc在刚学的 ...
- 算法实践--最小生成树(Kruskal算法)
什么是最小生成树(Minimum Spanning Tree) 每两个端点之间的边都有一个权重值,最小生成树是这些边的一个子集.这些边可以将所有端点连到一起,且总的权重最小 下图所示的例子,最小生成树 ...
- 模板——最小生成树kruskal算法+并查集数据结构
并查集:找祖先并更新,注意路径压缩,不然会时间复杂度巨大导致出错/超时 合并:(我的祖先是的你的祖先的父亲) 找父亲:(初始化祖先是自己的,自己就是祖先) 查询:(我们是不是同一祖先) 路径压缩:(每 ...
- 数据结构之最小生成树Kruskal算法
1. 克鲁斯卡算法介绍 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法. 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路. 具体做法:首先构造一个 ...
- 数据结构:最小生成树--Kruskal算法
Kruskal算法 Kruskal算法 求解最小生成树的还有一种常见算法是Kruskal算法.它比Prim算法更直观.从直观上看,Kruskal算法的做法是:每次都从剩余边中选取权值最小的,当然,这条 ...
随机推荐
- LeetCode题解——ZigZag Conversion
题目: 把一个字符串按照Z型排列后打印出来,例如 "PAYPALISHIRING" 重新排列后为3行,即 P A H N A P L S I I G Y I R 那么输出为&quo ...
- python bisect模块
转发:http://www.cnblogs.com/skydesign/archive/2011/09/02/2163592.html 先看看模块的结构: 前面五个属性大家感兴趣可以打出来看看数值,这 ...
- matlab 函数说明--fspecial
好吧,这个函数在图像处理中运用得非常广泛,虽然我还是觉得不知道为啥要取这个名字,fspecial的作用如下: 产生一个预定义的2D 滤波器(create a predefined 2D ...
- 50道经典的JAVA编程题(46-50)
50道经典的JAVA编程题(46-50),最后五道题了,这是一个美妙的过程,编程真的能让我忘掉一切投入其中,感觉很棒.今天下午考完微机原理了,大三上学期就这样度过了,这学期算是解放了,可是感觉我还是没 ...
- sqlserver任务导出Excle
--sql语句就用下面的存储过程 /*--数据导出Excel 导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件,如果文件不存在,将自动创建文件,如果表不存在,将自动创建表基于通用性 ...
- Python几个算法实现
1.平衡点问题: 比如int[] numbers = {1,3,5,7,8,25,4,20}; 25前面的总和为24,25后面的总和也是24,25这个点就是平衡点:假如一个数组中的元素,其前面的部分等 ...
- 在Mac上通过Sublime、Skim编辑LaTeX
转自:http://painterlin.com/2014/08/10/Using-LaTeX-with-Sublime-and-Skim-for-Mac.html Sublime Text是一款非常 ...
- leetcode@ [30/76] Substring with Concatenation of All Words & Minimum Window Substring (Hashtable, Two Pointers)
https://leetcode.com/problems/substring-with-concatenation-of-all-words/ You are given a string, s, ...
- HDU-4704 Sum 大数幂取模
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4704 题意:求a^n%m的结果,其中n为大数. S(1)+S(2)+...+S(N)等于2^(n-1) ...
- 如何搭建ss服务器
由于是Red Hat系统,缺少epel包,需要先安装该包才能安装python-pip,命令如下: rpm -iUvh http://dl.fedoraproject.org/pub/epel/7/x8 ...