码迷,mamicode.com
首页 > 编程语言 > 详细

最小生成树之Prim算法

时间:2017-05-15 22:27:18      阅读:479      评论:0      收藏:0      [点我收藏+]

标签:好的   代码   log   比较   class   算法   贪心算法   技术分享   error   

1 最小生成树的概念

最小生成树的概念:是由图生成而来的

是一棵树

1.无回路

2.如果有V个定点就有V-1条边

是生成树

1.包含图中所有的节点V

2.V-1条边都在图里面

3.边的权重和最小。

4.向生成树中添加任意一条边都构成回路。


2 算法思想:贪心算法

“贪”:每一步都要最好的。

“好”:权重最小的边

约束条件:

1.只能使用图里面的边

2.只能正好使用V-1条边

3.不能有回路


3 Prim算法—让一棵小树慢慢长大

3.1算法思想:

1.先选择一个顶点作为树的根节点,把这个根节点当成一棵树

2.选择图中距离这棵树最近但是没有被树收录的一个顶点,把他收录在树中,并且保证不构成回路

3.按照这样的方法,把所有的图的顶点一一收录进树中。

4.如果没有顶点可以收录

a.如果图中的顶点数量等于树的顶点数量-->最小生成树构造完成

b. 如果图中的顶点数量不等于树的顶点数量-->此图不连通

下面使用图片来具体描述此算法的算法思想:

技术分享

 3.2Prim算法的伪代码描述

通过我们对算法的描述,我们发现Prim算法和Dijkstra算法很类似

void Prim()

{

MST = {s};

while (1) {

V = 未收录顶点中dist最小者;

if ( 这样的V不存在 )

break;

V收录进MST: dist[V] = 0;

for ( V 的每个邻接点 W )

if ( dist[W]!=W未被收录 0 )

if ( E (V,W) < dist[W] ){

dist[W] = E (V,W) ;

parent[W] = V;

}

}

if ( MST中收的顶点不到|V|)

Error ( “生成树不存在” );

}

对于Prim算法

1.dist代表的是什么,应该如何被初始化

dist代表距离当前生成树的最小距离。和根节点直接相邻的初始化为权重,其他的初始化为正无穷。等每插入一个树节点,对dist进行更新。对于已经收录的节点,更新其dist=0

2.该算法的时间复杂度是多少

该算法时间复杂度在于如何去 ”未收录顶点中dist最小者”如果是使用暴力搜索的方法,那么时间复杂的为T=O(n^2).此种算法对于稠密图比较适用。

 

最小生成树之Prim算法

标签:好的   代码   log   比较   class   算法   贪心算法   技术分享   error   

原文地址:http://www.cnblogs.com/yghjava/p/6858364.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!