Prim算法下的最小生成树详细解答

《算法导论》笔记(15) 最小生成树 部分习题 习题23.1-11 给定图G和一棵最小生成树T,假设减少了位于T之外的某条边的权重。因为T内的边,是连接所有结点的权重最小的,那么首先将T外的减少权重的边(u, v)加入T,然后在u, v中寻找所有的路径,去掉路径中权重最大的边。 习题23.2-3 使用斐波那契堆实现的Prim算法与使用二叉堆比较。因为斐波那契堆实现优先队列,使Prim算法的运行时间为O(E+VlgV),而二叉堆实现优先队列的P 阅读详情

1.最小生成树和最短路径之间的区别

拿Dijkstra最短路径算法距离,它求的是单源点到其他点的最短路径。
而最小生成树则求的是一个集合到另一个集合之间的最短距离,最小生成树是从全局考虑的代价最小,适用于铺设电缆线,或者是家庭排布电线等问题。

2.Prim算法的思想

step 1:Prim算法选一个任意的起始点作为当前我们集合中的点,并把这个点从图中剔去。可以用visited[i] = 1来描述

step 2:从当前点出发,将与当前点有相连的边的值都弄个dist[]数组中。dist[i]就代表你当前点距离i点的距离。

step 3:从dist[]中找到一个最小值(要求另一个节点是没被访问过的),那么当前点和dist[i]中的i组合成的边就是你最小生成树中的一条边。

step 4:把你新找到的点的visited数值更新。从你新找到边的那个新节点开始,更新从新节点到未访问过的节点的距离,如果从当前节点到一个未访问过的节点的距离小于原来的dist[]值,那么就更新它。你的dist可以是一个结构体,里面记录以哪个节点扩散进行更新的和更新后的权值。方便你输出了。

3.算法伪代码(伪代码更清楚哦)

for all i,j in graph:
	innitialize the graph[][];
	
for all v:
	visited[v] = 0;
	
cin>>start;//起始点可以随便你
visited[start] = 1;
for all i < V.size():
	dist[i].value = graph[start][i];//用起始节点到临近点的值来初始化距离数组
	dist[i].parent = start;



for(int i=0;i<V.size()-1;i++)//再找|V|-1个点就行了
{
	int min = M(一个足够大的数,用来寻找dist数组中最小值的);
	int position;//记录新找到的点的位置
	
	//找最小的已知权值的边
	for(int j=1; j<=V.size(); j++)//节点从1开始编号
	{
		if(!visited[j] && dist[j].value < min)
		{
			min = dist[j];
			position = j;
		}
	}
	//对新找到的节点的操作
	visited[position] = 1;
	cout<<dist[position].parent<<position<<dist[position].value;//这一步输出是可以输出你找到的最小生出树的边的
	
	//从新找的节点position更新到其他节点的距离,注意是点到点,中间没有其他点
	for all i <= V.size()
	{
		if(!visited[i] && graph[position][i] < dist[i])
		{
			dist[i] = graph[position][i];
			dist[i].parent = position;
		}
	}
}

4.性能分析

时间复杂度O(n^2) n为节点数。
可以用优先队列优化吖!!

【PTA】7-10 公路村村通 (最小生成树)(Prim+Kruskal) 7-10 公路村村通 (30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。 输出格式: 输出村村通... 阅读详情

相关推荐

小蔺的米哈游数据分析师之路——MYSQL篇

作为新人,记录自己mysql学习历程

weixin_47070228的博客 435

最小生成树普里姆算法Prim

无论是什么程序都要和数据打交道,一个好的程序员会选择更优的数据结构来更好的解决问题,因此数据结构的重要性不言而喻。数据结构的学习本质上是让我们能见到很多前辈在解决一些要求时间和空间的难点问题上设计出的一系列解决方法,我们可以在今后借鉴这些方法,也可以根据这些方法在遇到具体的新问题时提出自己的解决方法。(所以各种定义等字眼就不用过度深究啦,每个人的表达方式不一样而已),在此以下的所有代码都是仅供参考,并不是唯一的答案,只要逻辑上能行的通,写出来的代码能达到相同的结果,并且在复杂度上差不多,就行了。根据上文..

ZER00000001的博客 2925

K230开发板实战:5步搞定YOLOv8模型部署(附常见报错解决方案)

本文提供了一份详细的K230开发板部署YOLOv8模型的实战教程。内容涵盖从环境准备、模型转换到代码编写的完整流程,并重点解析了使用AICube工具链时常见的“生成部署文件异常”等报错解决方案,旨在帮助开发者高效完成嵌入式AI模型部署。

weixin_29053073的博客 787

数据结构-测试6

3比4先进,所以3比4后出,所以不可能得到。

m0_73557680的博客 1503

RaiDrive+AList保姆级教程:5分钟搞定OneDrive/百度网盘挂载到本地(附WebDAV配置)

本文提供RaiDrive+AList的保姆级教程,5分钟内实现将OneDrive/百度网盘挂载到本地的详细步骤,包括WebDAV配置。通过AList统一转换云存储协议,RaiDrive虚拟磁盘挂载,显著提升多网盘管理效率,适合需要跨平台操作文件的用户。

weixin_28331555的博客 457

基于STM32L4XX、HAL库的AD7124模数转换器ADC驱动程序设计

/ 检查ID是否正确 (AD7124-4/AD7124-8有不同的ID)// 转换为电压值 (假设使用内部2.5V基准)// 构造读命令: 1(R/W) + 1(0) + 6(寄存器地址)// 构造写命令: 0(R/W) + 1(0) + 6(寄存器地址).config = 0, // 使用配置0。内置可编程增益放大器(PGA):1-128倍。// 读取ADC数据。// 读取当前ADC控制寄存器。// 检查数据是否就绪。// 写回ADC控制寄存器。// 初始化AD7124。

zhusl6688的博客 520

图之最小生成树Prim算法详解(C语言版)

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

qq_44075108的博客 9480

论文研读 Corundum: An Open-Source 100-Gbps NIC

Corundum 通过在 FPGA 上构建并行 pipeline、高效 DMA 通道、无阻塞队列结构、低延迟调度器,实现了在 PCIe Gen3 x16 接口上稳定跑满 100Gbps 吞吐量。

Double Galaxy 489

Prim算法实现、最小生成树(加权无向图)

最小生成树 加权图,我们发现它的边关联了一个权重,那么我们就可以根据这个权重解决最小成本问题,但如何才能找到最小成本对应的顶点和边呢?最小生成树相关算法可以解决。 1. 最小生成树定义以及相关约定 定义: 图的生成树是它的一棵含有其所有顶点的无环连通子图,一副加权无向图的最小生成树它的一棵权值(树中所有边的权重之和)最小的生成树 约定: 只考虑连通图。最小生成树的定义说明它只能存在于连通图中,如果图不是连通的,那么分别计算每个连通图子图的最小生成树,合并到一起称为最小生成森林。 所有边的权重都各不相同。

一名小白的博客 2780

Echarts - 去掉图表上的横线和竖线

效果图 默认效果: 变为如下图所示效果: 实现方法 官方配置文档:https://echarts.apache.org/zh/option.html#radar.splitLine 在 xAxis yAxis 配置中分别加入以下代码: splitLine: { show:false }

🏆 前端领域优质创作者 1万+

基于STM32的汽车主门电动窗开关系统设计方案

以下是基于 STM32CubeMX 和 HAL 库的示例代码,可实现基本的功能。

weixin_42300449的博客 996

Prim算法实现最小生成树

Prim算法求最小生成树: 1. 从任意一个顶点(假设选1)开始构造生成树,首先将顶点1加入生成树中,用一个一维数组book标记那些顶点已经加入到了生成树中。 2. 用数组dis记录生成树到各个顶点的距离。最初生成树只有1号顶点,有直连边时,数组dis中存储的就是1号顶点到该顶点的边的权值,没有直连边的时候就是无穷大(INT_MAX),即初始化数组。 3. 从数组dis中选出离生成树最近的顶点(假设为顶点j)加入到生成树中(在数组dis中的最小值)。再以j为中间点,更新生成树到每一个非树顶点的距离,如果

qq_44423388的博客 1万+

手把手教你用LabelImg打造专属YOLO数据集:从标注到训练全攻略!

YOLO(You Only Look Once)是一种快速、高效的目标检测算法。它使用一种简洁的.txt文件格式来保存每张图片中的标注信息,适合构建自定义目标检测数据集。🔹 图像文件.jpg.png等;每张图片将对应一个同名的标签文件(.txtdog.jpg对应dog.txt;图像在训练前通常会被缩放成统一尺寸,例如 YOLOv3 默认输入为416x416。🔹 标签文件(.txt)是一个纯文本文件;每一行表示一个标注目标;字段说明类别编号,从0开始,例如:狗是0,猫是1x_center。

FJN110的博客 2468

12.2最小生成树

在加权连通图中,连接所有顶点的树形结构,且所有边的权值之和最小。

赵鑫亿的博客 824

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

hdu 1233 还是畅通工程 最小生成树prim

题目链接 题意:给出n个点,n*(n-1)/2条路,求最少的距离将所有点连接起来。 最小生成树模板题。 #include #include #include #include #define N 110 #define INF 0x7ffffff using namespace std; int v[N],d[N],mp[N][N],n; int prim() { for(i

弱菜zc 999

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

萌新关于最小生成树MST的Prim算法贪心正确性的浅显理解

【纪念本萌新的第一篇博客】 这篇文章是写给刚入门的自己看的,如果有别的同学也有类似的疑惑,欢迎交流♂。 最小生成树,既是从一个含有N个点的图中,选出N-1条边,并连接这N个点,使得选出的边的权值之和是所有方案中最小的。 网上关于Kruskal和Prim的讲解已经很多了,这里就不赘述。我在看关于Prim算法的讲解的时候,心中最疑惑的问题是:为什么这样的贪心是正确的? 粗略地想了一下,现在来浅谈我的理解。 1.先谈谈Prim的具体算法 举个例子,比如我们现在要求这个图的MST。 ...

rilegoule_的博客 818

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java:实现Prim算法(附带源码)

Java:实现Prim算法(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1079

Java:使用索引优先级队列数据结构实现Prim算法(附带源码)

Java:使用索引优先级队列数据结构实现Prim算法(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 830

HDU 1879 继续畅通工程

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1879 还是最小生成树的模板题 我用的Prim算法 View Code 1 #include<stdio.h> 2 #include<string.h> 3 int map[110][110],lowcost[110],visit[110]; 4 ...

weixin_30871293的博客 86

图的最小生成树:Prim算法--解锁一批边,解锁一批节点

1)图的算法是真的不困难,核心思想很简单,但是图的数据结构很难,在互联网大厂笔试面试中,没有任何人可以在笔试或者面试中写出来,时间太久了,这也不是考你撸代码的实力的好办法,更不是考你优化算法能力的最佳方案 2)Prim算法的关键就是每次拉所有解锁边中最小权重的那个边,进来,做最小生成树。 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

weixin_46838716的博客 445

POJ-1789 Truck History(prim算法,最小生成树)

最小生成树模板题。一开始把字符数组定义成了整型数组又用了scanf..wa了好几次才发现。 prim算法和最短路里的Dijstra算法非常相似,只是在对点的距离定义上有所区别..理解起来很方便. 题目比较简单,直接贴代码了includeincludeincludeincludeusing namespace std; const int INF=0x3f3f3f3f; const int M

dooooos的修炼之地 255

C/C++数据结构——公路村村通(Prim)

公路村村通(Prim)现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。这道题我刚开始想着dijkstra也能做,但是忽略了**dijkstra算法是针对源点到某一点的距离**,而**prim算法是针对某一点到生成树的最短距离**,这样

weixin_44546342的博客 1016

算法89---图的最小生成树

一、Prim算法实现 思路: 1、一个存储最小树的边列表mst、一个存储最小树的点集合used、一个堆,排序最小树边缘的最小边。堆顶为最小值。 2、建立邻接表,如{'A':[(7,'A','B'),(5,'A','D')]} 3、随机选初始点 4、排序初始点的边权重,建立堆 代码: from heapq import heapify, heappop, heappush ...

weixin_30786617的博客 90

HDU 1233 还是畅通工程(最小生成树 Prim+Kruskal)

原题地址http://acm.hdu.edu.cn/showproblem.php?pid=1233 题意:(最小生成树裸题)有N个村庄,给出村庄两两之间的距离,要求铺设公路,使得任何两个村庄间都可以实现互通(不一定有直接的公路相连,只要能间接通过公路可达即可),计算最小的公路总长度。 解题思路上一题《HDU 1232 畅通工程》考察的是并查集的应用,这一题考察了比较重要的最小生成树算法。 最

Lecholin的博客 754

刷题笔记56—最短路径(Dijkstra)、最小生成树(Prim、Kruskal)

题目链接 题目描述 万圣节的早上,小Hi和小Ho在经历了一个小时的争论后,终于决定了如何度过这样有意义的一天——他们决定去闯鬼屋! 在鬼屋门口排上了若干小时的队伍之后,刚刚进入鬼屋的小Hi和小Ho都颇饥饿,于是他们决定利用进门前领到的地图,找到一条通往终点的最短路径。 鬼屋中一共有N个地点,分别编号为1…N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是...

优快云_dzh的博客 1134

最小生成树 & 洛谷P3366【模板】最小生成树 & 洛谷P2820 局域网

嗯... 理解生成树的概念: 在一幅图中将所有n个点连接起来的n-1条边所形成的树。 最小生成树: 边权之和最小的生成树。 最小瓶颈生成树: 对于带权图,最大权值最小的生成树。 如何操作? 1.Prim算法(O(mlogn)) 2.Kruskal算法(O(mlogn)) 推荐使用第二种,无需建图。 算法流程: Prim算法:(思想类似dijkstra) ...

weixin_30664539的博客 102
上一篇: floyd最短路径算法简单的很。。
下一篇: 用Kruskal算法实现图的分簇
Novicee
博客等级 码龄8年 20粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值