最小生成树——普里姆算法(Prim算法)和克鲁斯卡尔算法(Kruskal算法)

最小生成树构建算法 —— Kruskal算法克鲁斯卡尔算法)、Prim算法普里姆算法 分成两个集合,分别为集合X集合Y,集合X初始化为图G中的任意一个顶点,剩余的顶点全部放入集合Y中,每次选取集合X到集合Y中的权值最小的边用于构建最小生成树,直到所有的点都被添加进来之后,如果边的条数为 n-1,则构建出来的就是最小生成树。假设原连通图有n个顶点,而极大无环子图要保证连通性,肯定要包含n个顶点,又要保证无环,最多只能包含n-1条边。示例代码设置为类的成员函数,由于篇幅原因并没有在此给出图这个类的全部代码,任给一个有n个顶点的连通图G{V, E},其中V是点集,E是边集。 阅读详情

一、普里姆算法(Prim算法)

(1)算法

1)将v0到其他顶点的所有边当作侯选边;
2)重复一下步骤n-1次,使得其他n-1个顶点被并入到生成树中。
①从侯选边中挑选出权值最小的边输出,并将与该边另一端相接的顶点v并入生成树中;
②考查所有剩余顶点vi,如果(v,vi)的权值比lowcost[vi]小,则用(v,vi)的权值更新lowcost[vi]。

/*邻接矩阵的结构定义*/
typedef struct{
	int no; //顶点编号
	//char info; //顶点其他信息
}VertexType;
typedef struct{ //图的定义
	int edges[maxSize][maxSize]; //邻接矩阵定义
	int n, e; //分别为顶点数和边数
	VertexType vex[maxSize]; //存放顶点信息
}MGraph; //图的邻接矩阵类型

void Prim(MGraph g, int v0, int &sum){
	int lowcost[maxSize], vset[maxSize], v;
	int i, j, k, min;
	for(i=0;i<n;i++){
		lowcost[i]=g.edges[v0][i];
		vset[i]=0;
	}
	vset[v0]=1; //将v0并入树中
	sum=0; //sum清零,用来累计树的权值
	for(i=0;i<n-1;i++){
		min=INF;
		for(j=0;j<g.n;j++){
			if(vset[j]==0&&lowcost[j]<min) //选出当前生成树到其余顶点,最短边中的最短的一条
				min=lowcost[j];
				k=j;
		}
		vset[k]=1;
		v=k;
		sum+=min; //用sum记录最小生成树的权值
		/*下面这个循环,以刚并入的顶点v为媒介,更新侯选边*/
		for(j=0;j<n;j++){
			if(vset[
C语言-最小生成树Prim算法 最小代价生成树 最小生成树算法普里姆算法Prim):对顶点 克鲁斯卡尔算法Kruskal):对边 普里姆算法 阅读详情

相关推荐

(超简单、超易懂、超详细)算法精讲(二十一)普里姆算法

普里姆算法Prim's algorithm)是一种用于求解最小生成树问题的算法最小生成树是指在一个加权连通图中,找出一个生成树,使得所有边的权值之最小。普里姆算法的基本思想是从一个起始顶点开始,逐步扩展生成树,直到包含所有顶点。具体步骤如下:1. 初始化一个空的生成树。2. 选择一个起始顶点,将其加入生成树中。3. 在生成树与非生成树的边中选择权值最小的边,将其加入生成树中。4. 重复第三步,直到生成树包含所有顶点。普里姆算法可以用于求解带权无向图的最小生成树问题。

Malex2024的博客 2503

prim算法时间复杂度如何计算

Prim算法时间复杂度取决于它所使用的数据结构。如果使用邻接矩阵来存储图中的边,那么 Prim 算法时间复杂度是 O(n^2)。如果使用邻接表来存储图中的边,那么 Prim 算法时间复杂度是 O(n^2)。 在最坏情况下,Prim 算法需要访问所有的边点,因此时间复杂度是 O(n^2)。然而,在最优情况下,Prim 算法只需要访问少数的边点,因此时间复杂度是 O(n)。 总的来说,Pri...

weixin_42601608的博客 8194

数据结构克鲁斯卡尔(Kruskal)算法 —PK— 普里姆(Prim)算法

求图的最小生成树的典型算法克鲁斯卡尔Kruskal算法;普里姆(Prim算法。考虑问题的出发点相同:为使生成树上边的权值之达到最小,则应使生成树中每一条边的权值尽可能的小。

四季轮换叶,一路招摇胜 1万+

Prim算法Kruskal算法浅析

Prim算法Kruskal算法浅析 问题描述 举一个实例,画出采用Prim算法构造最小生成树的过程 举一个实例,画出采用Kruskal算法构造最小生成树的过程 理论解析 Prim: 初始化:向空结果树T=(Vt,Et)中添加图G=(V,E)的任一顶点u0,使Vt={ u0 },Et为空集; 循环(直到Vt=V):从图G中选择满足{(u,v)| u∈Vt,v∈V-Vt}且具有最小权值的边(u,v),并置Vt=Vt∪{v},Et=Et∪{(u,v)}。 Kruskal: 初始化:Vt=V,Et=空集。及使每个

qq_49056623的博客 3527

最小生成树(普里姆算法Prim】与克鲁斯卡尔算法Kruskal)

写在前面:博主是一位普普通通的19届二本大学生,平时最大的爱好就是听听歌,逛逛B站。博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事,做自己以后不会留有遗憾的事,做自己觉得有意义的事,不浪费这大好的青春年华。博主写博客目的是记录所学到的知识并方便自己复习,在记录知识的同时获得部分浏览量,得到更多人的认可,满足小小的成就感,同时在写博客的途中结交更多志同道合的朋友,让自己在技术的路上并不孤单。 目录: 1. 2. 3.  &n.

记录博主学到的点滴 1万+

图解最小生成树 --- 克鲁斯卡尔算法(Kruskal)普里姆算法(Prim)

所以选择BF相连。第八步B-A-H-G-F-C-I-D组成集合M,剩下的点到这个集合的距离的最小值是9,也就是E到M的距离,也就是E到D的距离。第七步B-A-H-G-F-C-I组成集合M,剩下的点到这个集合的距离的最小值是7,也就是D到M的距离,也就是D到C的距离。第六步B-A-H-G-F-C组成集合M,剩下的点到这个集合的距离的最小值是2,也就是I到M的距离,也就是I到C的距离。第五步B-A-H-G-F组成集合M,剩下的点到这个集合的距离的最小值是4,也就是C到M的距离,也就是C到F的距离。......

weixin_60569662的博客 4026

最小生成树——prim 普里姆算法 Kruskal 克鲁斯卡尔算法

假设 N-(V,{E})s

xtji1988的专栏 965

数据结构算法复杂度总结

遍历图的过程实质上是对每个顶点查找其邻接点的过程,其耗费的时间取决于所用的存储结构 一、BFS算法的性能分析 1.空间复杂度 无论是邻接表还是邻接矩阵的存储方式, BFS算法都需要借助一个辅助队列Q, n个顶点均入队一次,在最坏的情况下,空间复杂度为O(V)。 2.时间复杂度 采用邻接表存储方式时,每个顶点均需搜索一次(或入队一次),故时间复杂度为0(V),在搜索任一顶点时,顶点后边的链表都要访问一次,在搜索完V个顶点后,边表也就都访问了,故时间复杂度为O(E),算法总的时间复杂度为O(V+E)

Anthony_4926 8434

最小生成树之普里姆(Prim)算法克鲁斯卡尔(Kruskal)算法

作者:STzen 链接:https://www.jianshu.com/p/683ffde4f3a3 来源:简书 最小生成树 列子引入 如图假设v0到v8表示9个村庄,现在需要在这9个村庄假设通信网络。村庄之间的数字代表村庄之间的直线距离,求用最小成本完成这9个村庄的通信网络建设。 分析 这幅图是一个带权值的图,即网结构。 所谓最小成本,就是n个顶点,用n-1条边把一个连通图连接起来,并且使...

糖长老莫小贝的博客 2万+

最小生成树 普里姆算法时间复杂度为O(n*n),适用于稠密图。(n为顶点数); 克鲁斯卡尔算法主要针对边展开,边数少时效率会很高,所以对于稀疏图有优势。

1:克鲁斯卡尔算法时间复杂度为O(e*loge) e为边数。克鲁斯卡尔算法主要针对边展开,边数少时效率会很高,所以对于稀疏图有优势。 2:普里姆算法时间复杂度为O(n*n),适用于稠密图。(n为顶点数); **结论:**稀疏就用第一个,稠密就第二个。 ...

小帅哥快来看啊的博客 1万+

【Algorithm】Prim

朴素版prim算法 时间复杂度是 O(n^2+m), n 表示点数,m表示边数 int n; // n表示点数 int g[N][N]; // 邻接矩阵,存储所有边 int dist[N]; // 存储其他点到当前最小生成树的距离 bool st[N]; // 存储每个点是否已经在生成树中 // 如果图不连通,则返回INF(值是0x3f3f3f3f), 否则返回最小生成树的树边权重之 int prim() { memset(dist,...

CodeEcho 719

最小生成树Prim算法)笔记

引言: 最小生成树是在图 (邻接矩阵) 中选择出一个权值累加最小的树,所以自己首先需要构建一个图(邻接矩阵)。如: v0 --> v2 = ∞,说明v0到v2这两个结点没有边 v0-->v0=0,说明是自身结点 v1->v0=10,表示v1->v0结点的权重为10。 思路: 1给定以顶点v开始, 现在用v来初始化辅助数组shortEdge, 2.给定其实结点v,从v结点开始生成树. 首先将v结点加入生成树. 3.之后进入循环n-1次循环,因为n个顶点,v结点...

DL猿 3090

最小生成数算法(图论)

最小生成树算法与原理

Li_yue_zhen的博客 1361

最小生成树primkruskal算法

最小生成树primkruskal算法 一般Kruskal用的比prim多,因为prim可以解决的,kruskal一定可以解决,反过来就不一定了。 prim算法 prim 算法采用的是一种贪心的策略。 每次将离连通部分的最近的点点对应的边加入的连通部分,连通部分逐渐扩大,最后将整个图连通起来,并且边长之最小。有点类似与Dijkstra算法。 代码思想Dijk极其相似,只有dist的定义变了,变成了到集合的最短距离。 #include<cstring> #include<iostr

qq_45766916的博客 1553

算法学习笔记】24:Prim算法Kruskal算法最小生成树

Prim算法Dijkstra算法很相似,而且也按照是不是稀疏图分成了两种: 对于稠密图,用朴素版的Prim算法时间复杂度O(n2)O(n^2)O(n2) 对于稀疏图,用堆优化版的Prim算法时间复杂度O(mlogn)O(mlogn)O(mlogn) Kruskal算法的时间瓶颈在于它需要对所有边从小到大排序,所以时间复杂度是O(mlogm)O(mlogm)O(mlogm),由于m<n2m < n^2m<n2,所以mlogm<mlog(n2)=2mlognmlogm <

大桔骑士的学习笔记 1826

Prim算法(java)

一、Prim算法介绍   Prim(普利姆)算法是一种构造最小生成树算法Prim算法时间复杂度为O(∣V∣2)O(|V|^2)O(∣V∣2),不依赖于EEE,因此它适用于求解边稠密的图的最小生成树。 二、Prim算法原理   (1)初始时从图中任取一顶点加入最小生成树MinTree顶点集合中。   (2)选择一个与当前MinTree中顶点集合距离最近的顶点,并将该顶点相应的边加入MinTree中,每次操作后MinTree中的顶点数边数都增1。   (3)重复(2)步骤,直到所有顶点都加入到MinT

weixin_43698993的博客 4386

普里姆算法(Prim)

普里姆(Prim)算法是一种构造性算法。假设G=(V,E)G=(V,E)是一个具有nn个顶点的带权连通图,T=(U,TE)T=(U,TE)是GG的最小生成树,其中UU是TT的顶点集,TETE是TT的边集,则从v0v_0开始构造最小生成树TT的步骤如下:   1) 初始化={v0}\{v_0\},将v0v_0到其他顶点的所有边作为候选边。   2) 重复以下操作n−1n-1次,使得其他n−1n-1

sanqima的专栏 6494

Prim算法Kruskal算法到底哪个好?

遇到困难时首先想到的不应该是退缩,而是探索!文章粗浅,希望对大家有帮助!【最小生成树Prim算法Kruskal算法的区别对比Prim算法(java)克鲁斯卡尔算法Kruskal)详解。

仰望天空,妳我亦是行人. 2163
上一篇: 图的遍历算法操作——深度优先搜索遍历和广度优先搜素遍历
下一篇: 图的最短路径——迪杰斯特拉算法(Dijkstra算法)、弗洛伊德算法(Floyd算法)和广度优先搜索(BFS)算法求最短路径(无权图)
youngurt
博客等级 码龄11年 12粉丝 23原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值