最小生成树——Prim算法理解
背景:本文是在小甲鱼数据结构教学视频中的代码的基础上,添加详细注释而完成的。该段代码并不完整,仅摘录了核心算法部分,结合自己的思考,谈谈理解。
Prim算法理解:
如图(摘录自小甲鱼教学视频中的图片),是一个带有权值的连通网。
根据上图可以列写出该连通网的邻接矩阵,为了方便直观的理解:
权值 | V0 | V1 | V2 | V3 | V4 | V5 |
V0 | 0 | 6 | 1 | 5 | Ꚙ | Ꚙ |
V1 | 6 | 0 | 5 | Ꚙ | 3 | Ꚙ |
V2 | 1 | 5 | 0 | 7 | 5 | 4 |
V3 | 5 | Ꚙ | 7 | 0 | Ꚙ | 2 |
V4 | Ꚙ | 3 | 5 | Ꚙ | 0 | 6 |
V5 | Ꚙ | Ꚙ | 4 | 2 | 6 | 0 |
如上图所示,实际上Prim算法求解最小生成树的过程就是不断地寻找已走过顶点的最近顶点的过程(边权值最小)。
因此如上图所示,起点在V0点,寻找最近顶点,即V2点;找到V2点后,V2点作为当前顶点,继续寻找最近顶点,这时和已走过的顶点(V0、V2)直接连通的点共有4个:V1、V3、V4、V5,但是显然求解最小生成树不能重复进入已经走过的点,对于这个问题Prim算法采用的方法是将已经走过的点到任何点的权值都设定为0,然后在寻找最短边时,忽略权值为0点边。
这样当我们站在V2点处时,已走过的点到各个点之间的最短权值分别为:
权值 | V0 | V1 | V2 | V3 | V4 | V5 |
V0、V2 | 0 | 5 | 0 | 5 | 5 | 4 |
以上叙述的内容其实就是Prim算法的核心,即:①寻找最近点;②迭代lowcost数组。
在实际的算法实现中,就是通过这样一步一步迭代lowcost数组,然后在lowcost数组中寻找最小的权值,作为目标点,最终实现以最短路径遍历连通网。
代码及详细注释:
void MiniSpanTree_Prim(MGraph G)
{
int min,i,j,k;
/* 邻接数组 保存每一个顶点的邻接点(也就是上一个走过的点)的下标 */
int adjvex[MAXWEX];
/* 保存当前顶点向其他顶点的距离(其中已完成的顶点置零,表示不能再走) */
int lowcost[MAXWEX];
lowcost[0] = 0;
adjvex[0] = 0;
/* init */
for(i=1;i<G.numVertexes;i++)
{
/* 将邻接矩阵第0行所有权值先加入数组 */
/* 也就是将生成树的初始位置设定在该顶点 */
/* 注意这个lowcost数组是逐级更新的:迭代到下一个点的时候,更新locwost数组 */
/* lowcost数组更新原则: 已走过的点的lowcost值均保持0(即不再重复进入)
将当前点到其他点的权值小于lowcost数组的,更新到lowcost数组中(为了保证每一次走的都是最短路径) */
lowcost[i] = G.arc[0][i];
/* 邻接数组初始化为0 */
adjvex[i] = 0;
}
/* the real process creating the minispantree */
for(i=1;i<G.numVertexes;i++)
{
/* min初始化为不可能的值(65535) */
min = INFINITY;
j = 1;
k = 0;
/* 遍历全部顶点 */
while(j<G.numVertexes)
{
/* 找到当前顶点的可行边中权值最小的边 此即当前顶点的下一个邻接点 */
if(lowcost[j] != 0 && lowcost[j] < min)
{
min = lowcost[j];
k = j;
}
j++;
}
/* 打印点与点的邻接关系 遍历完成后这些邻接关系组合在一起就是最小生成树 */
printf("(%d,%d)",adjvex[k],k);
/* 这里很重要 */
/* 将已经走过的顶点对应lowcost数组中的权值置0 已确保不再重复进入 */
lowcost[k] = 0;
/* for循环完成lowcost数组的更新(更新原则在lowcost数组的定义初有详细注释) */
for(j=1;j<G.numVertexes;j++)
{
/* 到已走过的点的权值不更新(保持为0,两行之前的赋值完成) */
/* 邻接矩阵中当前点到其他点的权值小于lowcost数组的更新 */
if(lowcost[j] != 0 && G.arc[k][j] < lowcost[j])
{
lowcost[j] = G.arc[k][j];
/* 邻接数组赋值(记录各点之间的邻接关系) */
adjvex[j] = k;
}
}
}
}
——cloud over sky
——2020/3/11
最小生成树——Prim算法理解的更多相关文章
- 最小生成树——Kruskal算法理解
背景:本文是在小甲鱼数据结构教学视频中的代码的基础上,添加详细注释而完成的.该段代码并不完整,仅摘录了核心算法部分,结合自己的思考,谈谈理解. Prim算法理解: 如图(摘录自小甲鱼教学视频中的图片) ...
- 图论算法(五)最小生成树Prim算法
最小生成树\(Prim\)算法 我们通常求最小生成树有两种常见的算法--\(Prim\)和\(Kruskal\)算法,今天先总结最小生成树概念和比较简单的\(Prim\)算法 Part 1:最小生成树 ...
- 最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析
最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析 最小生成树,老生常谈了,生活中也总会有各种各样的问题,在这里,我来带你一起分析一下这个算法的思路与实现的方式吧~~ 在考研中呢 ...
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- 最小生成树Prim算法(邻接矩阵和邻接表)
最小生成树,普利姆算法. 简述算法: 先初始化一棵只有一个顶点的树,以这一顶点开始,找到它的最小权值,将这条边上的令一个顶点添加到树中 再从这棵树中的所有顶点中找到一个最小权值(而且权值的另一顶点不属 ...
- 最小生成树—prim算法
最小生成树prim算法实现 所谓生成树,就是n个点之间连成n-1条边的图形.而最小生成树,就是权值(两点间直线的值)之和的最小值. 首先,要用二维数组记录点和权值.如上图所示无向图: int map[ ...
- Highways POJ-1751 最小生成树 Prim算法
Highways POJ-1751 最小生成树 Prim算法 题意 有一个N个城市M条路的无向图,给你N个城市的坐标,然后现在该无向图已经有M条边了,问你还需要添加总长为多少的边能使得该无向图连通.输 ...
- SWUST OJ 1075 求最小生成树(Prim算法)
求最小生成树(Prim算法) 我对提示代码做了简要分析,提示代码大致写了以下几个内容 给了几个基础的工具,邻接表记录图的一个的结构体,记录Prim算法中最近的边的结构体,记录目标边的结构体(始末点,值 ...
- 模板——最小生成树prim算法&&向前星理解
通过最小生成树(prim)和最短路径优化引出的向前星存图,时至今日才彻底明白了.. head[i]存储的是父节点为i引出的最后一条边的编号, next负责把head[i]也就是i作为父节点的所有边连接 ...
随机推荐
- Redis 6.0 新特性-多线程连环13问!
Redis 6.0 来了 在全国一片祥和IT民工欢度五一节假日的时候,Redis 6.0不声不响地于5 月 2 日正式发布了,吓得我赶紧从床上爬起来,学无止境!学无止境! 对于6.0版本,Redis之 ...
- MAC使用vagrant搭建开发环境
公司的开发环境是这样的: Windows主机通过虚拟机安装CentOS.平时在Windows下编辑代码,然后跑到虚拟机里编译. 我自己有台MAC,本来准备直接在MAC上装开发环境的.基于以下两个原因放 ...
- [LiDAR数据模拟]系列(2) HELIOS的TLS点云模拟流程
关键词:地基激光雷达 点云模拟 XML文件 作者:李二 日期:07/05/2020 - 08/05/2020 我目前仅仅使用了TLS模式进行模拟,所以先讲一下TLS的模拟经验. ALS和MLS的模拟, ...
- python学习之变量以及变量/标识符/关键字
Python成为一门易读.易维护,并且被大量用户所欢迎的.用途广泛的语言,代码简洁,功能强大,是使程序员能够专注于解决问题而不是研究语言本身.接下来我们先从它的语法开始学起 1.首先要懂得python ...
- Asp.Net Core MVC在View中,根据用户权限动态生成菜单
1. 用户登录时,将用户的权限写入Cookie: //将需要的信息写入claims后 var identity = new ClaimsIdentity(claims, IdentityConstan ...
- 图形学_Bezier曲线
Bezier曲线由n个控制点生成,举个例子:当n=2时,点$P_0$.$P_1$之间遵从计算: $P_0=(1-t)P_0+tP_1$ 而推广为n维时,有: $P^n_0=(1-t)P^{n-1}_0 ...
- [hdu5360]贪心
题意:一个人想邀请n个人出去玩,假设当前同意和他一起去的人数为cnt,那么他去邀请i的时候,i同意的条件是L[i]<=cnt<=R[i],L[i],R[i]是给定的,问怎样安排邀请顺序,使 ...
- [codeforces 200 E Tractor College]枚举,扩展欧几里得,三分
题目出自 Codeforces Round #126 (Div. 2) 的E. 题意大致如下:给定a,b,c,s,求三个非负整数x,y,z,满足0<=x<=y<=z,ax+by+cz ...
- 06JAVA面向对象之封装
一.面向对象 1.面向过程和面向对象 面向过程 分析问题的步骤,然后逐步实现. 面向对象 (1)面向对象基于面向过程 (2)面向对象是找出解决问题的人,然后分配职责. (3)对象中包含解决问题的步骤 ...
- EOS基础全家桶(十二)智能合约IDE-VSCode
简介 上一篇我们介绍了EOS的专用IDE工具EOS Studio,该工具的优势是简单,易上手,但是灵活性低,且对系统资源开销大,依赖多,容易出现功能异常.那么我们开发人员最容易使用的,可能还是深度定制 ...