浅谈最小(代价)生成树(普利姆算法和克鲁斯卡尔算法)

最小生成树及其构造方法 最小生成树的概念以及怎么样利用普利姆算法和克鲁斯卡尔算法去构造一个图的最小生成树。利用通俗易懂的文字去一步步描述了普利姆算法和克鲁斯卡尔算法的精华并且举例说明了核心思想 阅读详情

一、普利姆算法

1、算法思想

       从图中任选一个顶点,把它当作一棵树,然后从与这棵树相接的边中选取一条权值最小的边,并将这条边及其所连接的顶点并入这棵树中,此刻就得到了一棵有三个顶点的树。然后从与这棵树相接的边中任选一条权值最小的边,将这条边及其所连接的顶点并入这棵树中,依次类推,直到图中所有的顶点都被并入树中为止,此时所得的树就是最小生成树。
       例如,图 1-1a所示的带权无向图采用普利姆算法求解最小生成树的过程如
图 1-1b~1-1e所示,以顶点0为起点,生成树过程如下:
       1)如图1-1a所示,与顶点0相接的三条边的权值分别为5、1、2,最小边权值为1;
       2)如图1-1b所示,选择权值为1的边,此时候选边的权值分别为5、3、2、6和2,最小边权值为2;
       3)如图1-1c所示,选择权值为2的边,此时候选边的权值分别为5、3、2和3,最小边权值为2;
       4)如图1-1d所示,选择权值为2的边,此时候选边的权值分别为5、3和4,最小边权值为3;
       5)如图1-1e所示,选择权值为3的边,此时所有的顶点都已并入生成树中,最小生成树求解过程完毕。

2、普利姆算法执行过程

       用普利姆算法构造最小生成树的过程中,需要建立两个数组vist[]和lowcost[]。当vist[i] = 1时,表示顶点i已经被并入生成树中,vist[i] = 0表示顶点i还未被并入生成树中。lostcost[]数组中存放当前生成树到剩余顶点最短边的权值。
       执行过程如下:
       1)将顶点v0到其他顶点的所有边作为侯选边。
       2)重复以下步骤n - 1次,使得其他n - 1个顶点被并入到生成树中。
       I 从侯选边中挑选权值最小的边输出,并将与该边另一端相接的顶点v并入到生成树中;
       II 查看所有剩余顶点vi,如果(v,vi)的权值比lowcost[vi]小,则用
(v,vi)的权值更新lowcost[vi]。

void Prim(MG g ,int v0,int &sum)
{
	int lowcost[maxSize], vist[maxSize], v;
	int i , j , k , min;
	v = v0;
	for(i = 0;i < g.n;i++){
		lowcost[i] = g.edges[v0][i];
		vist[i] = 0;
	}
	vist[v0] = 1;
	sum = 0;
	for(i = 0;i<g.n - 1;++i){
		min = INF;
		for(j = 0 ;j<g.n; ++j){
			if(vist[j] == 0&&lowcost[j]<min){
					min = lowcost[j];
					k = j;
			}
		}
		vist[k] = 1;
		v = k;
		sum += min;
		for(j = 0 ; j<g.n;++j){
			if(vist[j] ==0 &&g.edges[v][j]<lowcost[j]){
				lowcost[j] = g.edges[v][j];
			}
		}
	}
}

二、克鲁斯卡尔算法

1、算法思想

       每次找出侯选边中权值最小的边,就把该边并入生成树中,重复此过程,直到所有边都被检测完为止。

2、执行过程

typedef struct
{
	int a,b;
	int w;
}Road;
Road road[maxSize];
int v[maxSize];
int getRoot(int a ){
	while(a != v[a] ) 
	 	a = v[a];
	 return a; 
}
void Kruskal(MG g,int &sum,Road road[]){
	int i;
	int N,E,a,b;
	N = g.n;
	E = g.e;
	sum = 0;
	for(i = 0 ; i<N;++i)
		v[i] = i;
	sort(road,E);
	for(i = 0;i<E;++i){
		a = getRoot(road[i].a);
		b = getRoot(road[i].b);
		if(a != b){
			v[a] = b;
			sum += road[i].w;
		}
	}
}

三、两种算法的比较

1、普利姆算法时间复杂度为O(n^2),普利姆算法的时间复杂度只与图中顶点有关系,与边数没有关系,因此普利姆算法适用于稠密图; 克鲁斯卡尔算法时间主要花费在sort()函数上,因此克鲁斯卡尔算法的时间复杂度主要由选取的排序算法决定,排序算法所处理数据的规模由图的边数决定,与顶点数无关,因此克鲁斯卡尔算法适用于稀疏图;
2、普利姆算法和克鲁斯卡尔算法都是针对于无向图。

最小生成树(图解普里姆算法、图解克鲁斯卡尔算法) 文章目录一、最小生成树概述1.1 背景概述1.2 最小生成树的定义1.3 最小生成树构造算法二、普里姆算法2.1 普利姆算法介绍2.2 普利姆算法代码实现三、克鲁斯卡尔算法3.1 克鲁斯卡尔算法介绍3.2 克鲁斯卡尔算法代码实现 一、最小生成树概述 1.1 背景概述 问题描述: 假设要在 n 个城市之间建立通讯联络网,则连通 n 个城市只需要修建 n-1 条线路,每条城市之间的线路修建成本是不完全相同的,如何在最节省经费的前提下建立这个通讯网? 问题分析: n 个城市间,最多可设置 n(n-1)/2 条线路 阅读详情

相关推荐

最小生成树(C语言简单实现)

最小生成树 本文参考自《大话数据结构》 一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边。我们把构造连通网的最小代价生成树称为最小生成树 。 找连通网的最小生成树,经典的有两种算法:普里姆算法和克鲁斯卡尔算法。 普里姆(Prim)算法 /* Prim算法生成最小生成树 */ void MiniSpanTree_Prim(MGraph G){ int min, i, j, k; int adjvex[MAXVEX]; //保存相关顶点下标 int low

DFGOMC的博客 8134

最小生成树(详解普里姆算法)

C++详解用普里姆算法实现最小生成树

CXR_XC的博客 9626

【数据结构】最小生成树(普利姆算法和克鲁斯卡尔算法)

主要内容 基本概念 普利姆算法(加点法) 克鲁斯卡尔算法(加边法) 现实生活中的许多问题都可以转化为图来解决。例如,如何以最小成本构建一个通信网络,如何计算地图中两地之间的最短路径,如何为复杂活动中各子任务的完成寻找一个较优的顺序等。 四个常用算法:最小生成树、最短路径、拓扑排序和关键路径。 基本概念 假设要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路。这...

春雪阁 1594

最小生成树-Prim

算法基本思想非常简单, 将顶点分成两个集合U与V-U 每次从V-U中找到距离集合U最近的点E 取点E与集合U的最短连接边作为生成树的一条边 将E放入集合U中 重复,直到V-U为空 可以发现,其中比较关键的一个步骤就是寻找两个集合的最短连接边,我们可以用暴力方法解决,但是开销太大,所以这里我们可以这么做 建立两个数组:closest与lowcost closest用来记录集合V-...

Find me 390

图的最小生成树-克鲁斯卡尔算法

一、基本概念 生成树:一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边。 最小生成树:把构造连通网的最小代价生成树称为最小生成树。(一棵生成树的代价就是树上各边的代价之和)。 二、经典算法 克鲁斯卡尔算法(主要针对边来展开,边数少时效率会非常高,所以对于稀疏图有很大的优势) 1、主要思路,如下图所示: 按权值递增的顺序将连接了两棵树的边...

xiezhi123456的博客 4076

浅尝最小(代价)生成树——普利姆(prim)算法/克鲁斯卡尔(kruskal)算法

1普利姆算法 普利姆算法思想; 从图中任意取出一个顶点,把它当作一棵树, 然后从与这棵树相接的边中选取一条最短(权值最小)的边,并将这条边及其所连接的顶点也并入这棵树, 此时得到了一颗有两个顶点的树。然后依次操作,直到图中所有的顶点都被并入树中。 此时得到的生成树就是最小代价生成树 上图: 普利姆算法: 需要构建两个数组 vest[ ] : vest[ i ]=1表示顶点 i已经被并入生成树中,vest[ i ]=0表示顶点 i 还未被并入生成树中 lowcost[ ] : 存放当..

m0_55633659的博客 1445

数据结构 最小生成树 prim算法(普里姆算法)C语言实现

我们可以将定义理解为:将图的所有顶点分为两类,A类(保存已经查找过的顶点),B类(保存未查找过的顶点),从任一顶点开始,并将其从B类移至A类,然后开始寻找B类中(的顶点)到A类顶点之间权值最小的顶点,将其从B类中移至A类,重复上述操作,直至B类中没有顶点。所走过的顶点和边就是该连通图的最小生成树。

m0_62341092的博客 1万+

【图的应用一:最小生成树】- 用 C 语言实现普里姆算法和克鲁斯卡尔算法

用 C 语言实现普里姆算法和克鲁斯卡尔算法

melonyzzZ的博客 1046

【数据结构】——图的最小生成树算法(普里姆+克鲁斯卡尔)

这里的图指的是带权无向图,也就是无向网。 关于最小生成树,https://blog.youkuaiyun.com/namewdy/article/details/105645409 图的最小生成树要解决的问题:用最小的代价连通图中的所有顶点。 下面两种算法都是运用贪心思想,利用MST(Minimum Spanning Tree)性质构建最小生成树。 MST性质: 假设N=(V, E)是一个连通网,U是顶点集V的一个非空子集。若(u, v)是一条具有最小权值的边,其中u∈U,v∈V-U,则必存在一棵包含边(u, v).

atwdy的博客 2398

以GD32F103C8T6为例的核心板原理图PCB绘制学习笔记简单总结

重点在supplier part是立创商城的编号,可以搜到。

2301_80397661的博客 3261

u-boot-2014.10移植第22天----添加nand flash命令支持(四)

解决问题:nand0: MTD Erase failure: -5 drivers/mtd/nand/nand_bbt.c文件中初始化bbt/* * Allocate memory (2bit per block) and clear the memory bad block * table. */ this->bbt = kzalloc(len, GFP_

fulinux的博客 3632

【数据结构】图的最小生成树(普里姆Prim算法、克鲁斯卡尔Kruskal算法)(C语言)

一个连通图的生成树是指一个极小连通子图,它含有图中的全部顶点,但只有足以构成一棵树的 n-1 条边。在一个连通网的所有生成树中,各边代价之和最小的那棵生成树称为该连通网最小代价生成树(MST),简称为最小生成树。 利用普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法可以生成一个连通网的最小代价生成树。

weixin_51450101的博客 6139

鸿蒙应用发布实战:应用热更新的实现

在移动应用开发领域,应用更新是持续交付价值的关键环节。传统的应用更新方式需要用户手动下载完整安装包,不仅用户体验差,而且更新率往往不理想。热更新技术(也称为OTA更新)允许应用在不重新安装的情况下动态更新部分功能,极大提升了用户体验和迭代效率。本文专注于鸿蒙操作系统下的应用热更新实现方案,涵盖从原理到实践的完整知识体系。鸿蒙热更新的技术架构差分更新算法实现动态部署机制实际项目中的最佳实践安全与性能优化策略首先介绍鸿蒙热更新的背景和核心概念深入分析技术原理和算法实现。

操作系统内核探秘的博客 965

最小生成树算法之Prim(普里姆)算法

最小生成树的可以通过Kruskal(克鲁斯卡尔)算法或Prim(普里姆)算法求出。 Prim算法基本介绍: Prim算法又称为"加点法",每次找出距离(此处的距离指的是距离最小生成树的距离,若此处无法理解,可直接跳过,看完下面例子就能理解)最小的边对应的点。算法逐渐从某一个顶点s开始,逐渐将n个点纳入最小生成树中。 Prim算法基本步骤: 第一步:设图中所有顶点的集合为V,u代表已经加入最小生成树的顶点的集合,v代表未加入最小生成树的顶点的集合,最由于从某点s开始,因此u={s},v={V-u}

xiaoxi_hahaha的博客 3万+

Openclaw错误分析与解决方案之:Agent couldn’t generate a response.

Openclaw错误分析与解决方案之:Agent couldn't generate a response. Note: some tool actions may have already been executed — please verify before retrying.

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1316

RK3588开发笔记-spi扩展canfd芯片MCP2518FD调试笔记

在嵌入式系统开发中,CANFD(控制器局域网灵活数据速率)是一种广泛应用于汽车和工业自动化领域的通信协议。为了满足项目需求,我们在RK3588平台上通过SPI接口扩展了CANFD芯片MCP2518FD,之所以用spi进行canfd扩展,是为了解决原生RK3588原生can不够稳定的问题(发送扩展帧有几率编程标准帧,RK3568/3588均存在该问题)。通过本次调试工作,我们成功地在RK3588平台上扩展了CANFD芯片MCP2518FD,并实现了与CAN总线的稳定通信。

flypig has a dream! 4225

两种最小生成树的方法——普里姆算法、克鲁斯卡尔算法

一、最小生成树的概念 在连通网的所有生成树中,所有边的代价和最小的生成树。 二、MST性质 构建最小生成树的算法有多种,比如普里姆算法、克鲁斯卡尔算法。其中多数算法利用了最小生成树的下列一种简称MST的性质。 1、性质 假设N=( V , { E } )是一个连通网,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值的边,其中u∈U,v∈V-U,则必存在一颗包含边(u,v)的最小生成树。 图1 连通图N 2、...

三粒花生米的博客 1万+

【我的Android进阶之旅】异常: Problems reading data from Binary store in Local\Temp\gradlexxx.bin (exist: true)

一、异常描述 今天开个会议,电脑自动关机了,重启电脑之后,打开Android Studio,编译代码,就编译失败,如下所示:异常提示 : Caused by: java.lang.RuntimeException: Problems reading data from Binary store in C:\Users\000\AppData\Local\Temp\gradle6337489649031706149.bin (exist: true) Caused by: java.lang.Runtime

字节卷动 3822

最小生成树——贪心算法

文章目录1.生成树和最小生成树1.1 问题的定义1.2 MST性质2.普里姆算法(Prim)2.1 算法流程2.2 算法正确性证明2.3 算法实现2.4 测试代码3.克鲁斯卡尔算法 1.生成树和最小生成树 1.1 问题的定义 一个连通图 的生成树是一个极小连通子图,它含有图中全部的顶点,但是只有足有构成一棵树的n-1条边。它有如下性质: 一棵有nnn个顶点的生成树有且只有n−1n-1n−1条边;...

75 69 69 80 32 67 79 68 73 78 71 33 1万+

基于ADPSS的直驱风电单机模型建模指南:跟网型与构网型

本文介绍了基于ADPSS平台的直驱风电单机建模方法,包含跟网型和构网型两种控制策略。模型采用模块化设计,共享风力机与桨距角控制部分,通过FORTRAN语言实现自定义建模。跟网型采用锁相环同步和矢量控制,构网型则采用虚拟同步机技术模拟同步发电机特性。详细阐述了风力机气动模型、桨距角控制算法及代码实现,为新能源并网仿真提供了实用参考。全文约150字,涵盖模型架构、数学方程和ADPSS实现要点。

huanghm88的专栏 169

Windows11上pip安装IsaacSim5.1.0与IsaacLab

本文详细介绍了CUDA Toolkit 12.8.0、IsaacSim和IsaacLab的安装过程。首先从NVIDIA官网下载并安装CUDA Toolkit 12.8.0,然后通过miniforge创建conda环境(env_isaacsim)安装IsaacSim相关Python包,解决了Windows长路径问题。成功运行IsaacSim后,克隆IsaacLab仓库并完成安装验证,最后通过创建空场景测试环境配置。整个安装过程包含详细的命令行操作和问题解决方法,为机器人仿真开发环境搭建提供了完整指导。

拥抱具身智能,昇腾Ascend C 378

C语言数据结构与算法---最小生成树(克鲁斯卡尔算法)

文章目录一.克鲁斯卡尔(Kruskal)算法1.算法思想2. 克鲁斯卡尔算法的实现二. 普利姆算法与克鲁斯卡尔算法的比较1. 时间复杂度2.适应范围 一.克鲁斯卡尔(Kruskal)算法 1.算法思想 设连通网 N = (V,E) ,令最小生成树初始状态为只有 n 个顶点而无边的非连通图 T=(V,{}),每个顶点自成一个连通分量 在 E 中选取代价最小的边,若该边依附的顶点落在 T 中不同的...

myjess’s blog 4549

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

最小生成树

问题提出:     要在n个城市间建立通信联络网。顶点:表示城市,权:城市间通信线路的花费代价。希望此通信网花费代价最小。 问题分析:     答案只能从生成树中找,因为要做到任何两个城市之间有线路可达,通信网必须是连通的;但对长度最小的要求可以知道网中显然不能有圈,如果有圈,去掉一条边后,并不破坏连通性,但总代价显然减少了,这与总代价最小的假设是矛盾的。 结论:     希望找到一棵生成树,它的...

少说,多做。 3596

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

最小代价生成树实现(算法与数据结构设计)

由普利姆算法的时间复杂度O(n2),普利姆算法更适合当图中边的数量远大于点的数量的情形,在电路设计中可以应用于印刷电路板的布线问题以减少导线长度。由克鲁斯卡尔算法的时间复杂度O(eloge),克鲁斯卡尔算法更适合当图中点的数量远大于边的数量的情形,与普利姆算法类似,也可以用于优化连接路径的问题。

DAOkonglong的博客 954

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数据结构—— 最小生成树连通网的两种算法区别和用法【普里姆(Prim)算法-克鲁斯卡尔(Kruskal)算法】

目录: 一:最小生成树(Minimum Cost Spanning Tree) 1.定义 成本最小 2.图形化分析 3.分析 二:普里姆算法(Prim算法) 1.定义 2.算法步骤 3.算法简单描写叙述 A:输入: B:初始化: C:反复下列操作,直到Vnew= V: D:输出: 4.图例描写叙述 5.普利姆(Prim)算法适用于求解无向图中的最小生成树 6.简单...

刘鑫磊 1万+

数据结构—最小生成树

设R为G的所有生成树的集合,若T为R中边的权值之和最小的生成树,则T称为G的最小生成树(Minimum-Spanning-Tree,MST)。所以不选,在找,权值是5的有俩个,然而,学校和矿场确是俩通的,只能选农场和P城,选完以后发现全部连通。在从剩余的边中找到权值最小的,有俩个是P城和矿场以及P城和渔村,随便选都行。然后找那个点,到P城和学校形成的树中,最小代价的,我们可以看到,只有矿场到P城是最小的。然后看哪个点到这个三个点形成的树最小的代价,知道渔村是最小的,连接矿场和渔村。所以连接P城和矿场。

莫浅子的博客 1万+
上一篇: CSS实现垂直居中的常用方法总结(看了面试必过的那种)
下一篇: react build后页面空白,报错
Two_Bits
博客等级 码龄8年 25粉丝 23原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值