最小生成树问题---Prim算法与Kruskal算法实现(MATLAB语言实现)
2015-12-17晚,复习,甚是无聊,阅《复杂网络算法与应用》一书,得知最小生成树问题(Minimum spanning tree)问题。记之。
何为树:连通且不含圈的图称为树。
图T=(V,E),|V|=n,|E|=m,下列关于树的说法等价:
- T是一个树。
- T无圈,且m=n-1。
- T连通,且m=n-1。
- T无圈,但每加一新边记得到唯一一个圈。
- T连通,但任舍去一边就不连通。
- T中任意两点,有唯一道路相连。
何为生成树:若图G=(V,E)的生成子图是一棵树,则称该树为图G的生成树,也称支撑树,简称为图G的数。图G中属于生成树的边称为数枝(Branch)。
何为最小生成树:连通图G=(V,E),每条边上有非负权L(e)。一棵树上所有树枝权的总和,称为这个生成树的权。具有最小权的生成树称为最小生成树,也就是说最小支撑树,简称最小树。
私以为,两种算法其实都是贪心,所以需要严格的证明。由于最近时间零散、数学久置未学、对算法领域没有系统了解。所以不进行深入探讨(也就是说证明),仅以一个简单实例做一个入门级的了解。
Prim算法:
给定连通赋权图G=(V,E,W),其中W为邻接矩阵,设两个集合P和Q,其中P用于存放G的最小生成树中的节点,集合Q存放G的最小G的最小生成树中的边。另集合P的初值为P={v1}(假设构造最小生成树时从v1出发),集合Q的初值为P={空集}。
(1)P = {v1},Q = {空集};
(2)while P ~= Q
找到最小边pv,其中p∈P,v∈V-P;
P = P + {v};
Q = Q + {pv};
end
Kruskal算法
(1)选e1∈E(G),使得w(e1) = min(选e1的权值最小)。
(2)e1,e2,...,ei已选好,则从E(G)-{e1,e2,...,ei}中选取ei+1,使得G[{e1,e2,...,ei,ei+1}]中无圈,且,w(ei+1) = min。
(3)直到选得en-1为止。
以下是问题:
一个乡有9个自然村,其间道路及各道路长度如图所示,各边上数字代表距离。问如何架设电线最短。
预输入:
A = zeros();
A(,:) = [ ];
A(,[, ]) = [ ];
A(, ) = ;
A(, ) = ;
A(, ) = ;
A(, ) = ;
A(, ) = ;
A(, ) = ;
Prim算法实现:
A = A+A';
A(A==) = Inf;
P = zeros(, );
P(,) = ;
V = :;
V_P = V - P;
link = zeros(,);
k=;
while k<
p = P(P~=);
v = V_P(V_P~=);
pv = min(min(A(p,v)));
[x, y] = find(A==pv);
for i=:length(x)
if any(P==x(i)) && any(V_P==y(i))集合判断,关键!
P(,y(i)) = y(i);
V_P = V - P;
link(k, :) = [x(i), y(i)];
k = k+;
break;
end
end
end
输出:
>> link
link =
Kruskal算法实现:
A = sparse(A');
A(A==) = Inf; B = sparse(, );
link = graphallshortestpaths(B, 'directed', false);
while sum(sum(link)) == Inf%如果不连通,则和无穷大
ind = find(A==min(min(A)));
[x, y] = ind2sub(size(A), ind);%寻找最短边
for i=:length(x)
if link(x(i), y(i))==Inf%判断是否连通,关键!!
B(x(i), y(i)) = A(x(i), y(i));
A(x(i), y(i))=Inf;%取差集
end
end
link = graphallshortestpaths(B, 'directed', false);
end
输出:
B =
(,)
(,)
(,)
(,)
(,)
(,)
(,)
(,)
所以结果是:
(算法实现写于2015-12-18)
下一步工作,用其他语言实现,复杂度分析,深入论证算法正确性。
另外,代码中使用了graphallshortestpaths函数,这是最短路径的问题。关于最短路径将在下一篇讲述。其实MATLAB有关于求求最小生成树的函数graphminspantree,关于这一套函数,将结合官网资料,以后做梳理。
A = sparse(A');
>> graphminspantree(A)
ans =
(,)
(,)
(,)
(,)
(,)
(,)
(,)
(,)
如此,可直接求得最小生成树。
最小生成树问题---Prim算法与Kruskal算法实现(MATLAB语言实现)的更多相关文章
- 最小生成树问题------------Prim算法(TjuOj_1924_Jungle Roads)
遇到一道题,简单说就是找一个图的最小生成树,大概有两种常用的算法:Prim算法和Kruskal算法.这里先介绍Prim.随后贴出1924的算法实现代码. Prim算法 1.概览 普里姆算法(Prim算 ...
- 最小生成树-----Prim算法与Kruskal算法(未完
生成树(spanning tree):无向联通图的某个子图中,任意两个顶点互相都联通并且形成了一棵树,那么这棵树就叫做生成树. 最小生成树(MST,minimum spanning tree):如果为 ...
- 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind
最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...
- 转载:最小生成树-Prim算法和Kruskal算法
本文摘自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html 最小生成树-Prim算法和Kruskal算法 Prim算 ...
- C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)
1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...
- 最小生成树之Prim算法和Kruskal算法
最小生成树算法 一个连通图可能有多棵生成树,而最小生成树是一副连通加权无向图中一颗权值最小的生成树,它可以根据Prim算法和Kruskal算法得出,这两个算法分别从点和边的角度来解决. Prim算法 ...
- java实现最小生成树的prim算法和kruskal算法
在边赋权图中,权值总和最小的生成树称为最小生成树.构造最小生成树有两种算法,分别是prim算法和kruskal算法.在边赋权图中,如下图所示: 在上述赋权图中,可以看到图的顶点编号和顶点之间邻接边的权 ...
- 最小生成树Prim算法和Kruskal算法
Prim算法(使用visited数组实现) Prim算法求最小生成树的时候和边数无关,和顶点树有关,所以适合求解稠密网的最小生成树. Prim算法的步骤包括: 1. 将一个图分为两部分,一部分归为点集 ...
- Prim算法和Kruskal算法
Prim算法和Kruskal算法都能从连通图找出最小生成树.区别在于Prim算法是以某个顶点出发挨个找,而Kruskal是先排序边,每次选出最短距离的边再找. 一.Prim(普里姆算法)算法: ...
- 【数据结构】最小生成树之prim算法和kruskal算法
在日常生活中解决问题经常需要考虑最优的问题,而最小生成树就是其中的一种.看了很多博客,先总结如下,只需要您20分钟的时间,就能完全理解. 比如:有四个村庄要修四条路,让村子能两两联系起来,这时就有最优 ...
随机推荐
- python数字图像处理(16):霍夫圆和椭圆变换
在极坐标中,圆的表示方式为: x=x0+rcosθ y=y0+rsinθ 圆心为(x0,y0),r为半径,θ为旋转度数,值范围为0-359 如果给定圆心点和半径,则其它点是否在圆上,我们就能检测出来了 ...
- SlideAndDragListView,一个可排序可滑动item的ListView
SlideAndDragListView简介 SlideAndDragListView,可排序.可滑动item显示"菜单"的ListView. SlideAndDragListVi ...
- Windows下搭建PHP环境:Apache+PHP+MySQL
本文简单记录一下Windows下搭建PHP环境的过程,一些细节可以参照本文参考资料,此文不再赘述 准备工作: Windows下手工搭建PHP环境需要先下载相应的软件,需要注意的是Apache与PHP的 ...
- 彻底理解Toast原理和解决小米MIUI系统上没法弹Toast的问题
1.Toast的基本使用 Toast在Android中属于系统消息通知,用来提示用户完成了什么操作.或者给用户一个必要的提醒.Toast的官方定义是这样的: A toast provides simp ...
- HTML5+JS 《五子飞》游戏实现(二)路线分析和资源准备
上一节 里沃特与我们分享了<五子飞>的下棋规则,可能有些伙伴看得不清楚,像我们码农还是看到代码比较靠谱.下面就把可以走棋的路线跟大家说一下. 假设从左上角开始,以0开始编号,往右数(没看第 ...
- Python3 windows如何安装模块 setuptools
下载的module解压后里面有setup.py文件,如果打开setup.py文件里面有这段代码: from setuptools import setup ... setup( ... 这种的都需要调 ...
- T4模板——一个神奇的代码生成器
利用T4模板,可以很方便的从数据库映射成Model模型,相当于动软等功效.但动软是可以直接生成三层,抽象工厂的,T4没那么牛叉,所以我们一般只用作生成Modle或者Server等指定方法了. 废话少说 ...
- vijos-1003等价表达式
明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和 ...
- android 按钮点击效果实现 在studio下出现的错误
在照做上一篇随笔的时候 在studio下为了方便我在写完一个 btn_select.xml 文件后直接粘贴了三个文件到drawable下 结果问题来了 总是报这样一个错误: Resource is n ...
- ( 转 ) Android自绘字体大小paint.settextsize随分辨率大小变化
1.获取当前设备的屏幕大小 DisplayMetrics displayMetrics = new DisplayMetrics(); this.getWindowManager().getDefau ...