算法:Prim

应用:对一个带权无向图生成 (权值)最小生成树

(程序来自《天勤 数据结构 高分笔记》)

今日一签,赠给奋斗的自己和你们:

人生不能像做菜,把所有的材料都准备好了才下锅。
——李安《饮食男女》

讲述算法前,先做如下的说明:

1. 带权无向图的存储

把一个共有N个结点的带权无向图的信息(边以及边的权值)存放在一个大小为N乘N的二维方阵中。

带权无向图的N个结点的编号是0至N-1。

方阵元素[i][j]表示节点编号是i和j的2个节点之间的边的权值,

行标 = 列标 的 方阵元素 规定 其值是0,表示结点自身到自身的权值是0;

宏定义一个常量INF,把它的值设为大于图中所有边权值的一个数,这个自定,

若图中结点i与结点j之间没有边,规定二维方阵中的元素[i][j]的值是INF,表示两个结点之间的权值是无穷大。

图由结点和边构成,所以,结构体定义如下:

#define MAXSIZE 100

#define INF     500

typedef struct

{

int no;         // 存放结点的编号

char info;     // 存放结点的信息

}VertexType;         // 结点

typedef struct

{

int n,e;                     // n: 存放图的结点总数,e: 存放图的边的总数

int edges[MAXSIZE][MAXSIZE]; // 存放带权无向图的边和边的权值信息

VertexType vex[MAXSIZE];     // 存放带权无向图的结点信息

}MGraph; // 图

2. 树

树只有一个根,根下是各个子树,并且很重要的一点是这些子树互不相交,

所以树中是没有环的,

所以,在做这个算法的时候,不能到最后生成的是一个带环的图,

避免出现环,需要一个判断语句,这个判断语句什么时候应该出现,它的内容是什么,

读程序的时候请格外注意。

3. C++ 的 引用&

函数void Prim(MGraph g, int v0, int &sum)参数中的sum是C++中的引用类型,表示它的值在传进函数以后,其值需要跟着函数的功能实现而被改变。

C++代码: 
#include <iostream>using namespace std;#define MAXSIZE 100
#define INF     500typedef struct
{int no;char info;//
}VertexType;typedef struct
{int n,e;int edges[MAXSIZE][MAXSIZE];VertexType vex[MAXSIZE];
}MGraph;void Prim(MGraph g, int v0, int sum)
{int lowcost[g.n] = {0};int vset[g.n] = {0};int v;int i,j,k;int min;v = v0;vset[v] = 1;for(int i=0;i<g.n;++i)lowcost[i] = g.edges[v][i];sum = 0;for(int i=0;j<g.n-1;i++){min = INF;for(int j=0;j<g.n;++j)if(vset[j]==0 && lowcost[j] < min){min = lowcost[j];k=j;}v = k;vset[v] = 1;sum += min;for(int j=0;j<g.n;++j)if(vset[j]==0 && g.edges[v][j]<lowcost[j])lowcost[j] = g.edges[v][j];}
}int main()
{}

程序的说明:

1.

把一个很大的结构体MGraph作为函数的参数,浪费空间,这个在实际中需要改进。

作为考试代码,完全可以先这样写。

2.

外层的for循环,只需要执行g.n-1次(即 图的结点总数-1)即可,

因为参数v0表示MST的第一个起始结点,

又根据算法可以满足执行g.n-1次找到剩下的n-1个结点就完成MST的确定

3.

数组vset大小是图的结点个数,

初始化时元素都为0,

随着算法的进行,如果某个结点i归入了MST,那么vset[i]置为1,否则为0,

而程序中反复出现的判断语句vset[j]==0可以保证找到的树是一个不带环的图,这一点非常重要!!

待整个prim函数执行完,vset中的元素就会全部是1。

4.

数组lowcost大小是图的结点个数,

这个变量记录的是当前MST 到 剩余其他结点 的 最小路径值

一开始MST只是结点V0,

内层的第一个for循环用于使用当前的lowcost找到一个新的应该并入MST的结点v,

内层的第二个for循环用于通过刚找到的这个新的并入MST的结点v更新lowcost

5.

外层循环执行g.n-1(简写为n-1)次,

内层的2个for循环执行g.n(简写为n)次,

基本操作共执行(n-1)*(2n)次,

所以时间复杂度取大的量级为:n的平方,

也可以看出,Prim算法生成MST时间复杂度只与结点的个数有关,与边没有关系,

所以Prim算法适合 稠密图(结点多,边少)

6.

变量min表示

当前的MST树(中的各个节点)距离 剩下的 结点的 最小路径值 的 最小值

数据结构 之 Prim算法的应用 之 MST(最小生成树)相关推荐

  1. 最小生成树Prim算法

    MST性质理解 设图的总结点为V,以落在生成树上的结点集为U,那么尚未落在生成树上的结点集为V - U. 最小生成树最小边权选择:从U到V-U的连通边选择最短的边. prim算法思路 选择:MST性质 ...

  2. 最小生成树——普里姆(Prim)算法

    Prim算法的基本思想是以顶点为主导地位:从起始顶点出发,通过选择当前可用的最小权值的边把其他顶点加入到生成树中来.设连通无向网为G(V,E),在普里姆算法中,将顶点集合V分成两个子集T和T'. (1 ...

  3. prim算法直观理解与证明

    今天刚学完最小生成树,乘着知识还在脑袋里热乎着,便写下来记录下,也便日后复习回忆.prim算法是用来求解最小生成树的. 总的来说算法步骤就是: 1.将距离集合(即最小生成树)的距离最近的点加入到集合中 ...

  4. 邻接表实现Prim算法

    Prim算法 Prim算法是通过连通网找最小生成树(mst)的算法 过程: 1.首先选取任意顶点作为树的根 2.遍历其他(不在树中)的顶点,对于每个顶点,找到一条到mst路径最短的边,这样,每个顶点都 ...

  5. C语言实现Prim算法 —构建最小生成树

    目录 介绍Prim算法前的相关概念 一.Prim算法的思想 二.1.利用图形详细解释Prim算法的思想 Prim算法思想介绍 ​ 二.2利用图形又又解释Prim算法的思想 三.用图示结合代码中重要量进 ...

  6. Prim算法的C语言程序

    Prim算法是有关图的最小生成树的算法.1957年由美国计算机科学家罗伯特·普里姆(Robert C. Prim)独立发现. 百度百科:Prim算法. 维基百科:Prim's Algorithm. 参 ...

  7. [Java学习] 最小生成树——Prim算法

    文章目录 最小生成树 Prim算法流程 应用实例 求最小生成树 最小生成树 百度百科上对于最小生成树的定义是这样的:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结 ...

  8. Prim算法求最小生成树

    一.Prim算法 prim算法是用来求最小生成树的问题具体就是在一个图的n个节点找到n-1条边,使这n-1条边的权值最小 二.修路问题 在狗熊岭有如下七个村庄 村庄道路连接情况和距离如图所示 现在需要 ...

  9. c语言随机prim算法的迷宫生成,Prim算法生成迷宫

    初始化地图 function initMaze(r,c){ let row = new Array(2 * r + 1) for(let i = 0; i < row.length; i++){ ...

最新文章

  1. javascript Windows对象(BOM)
  2. wwww harmonyos,【新版本发布】HarmonyOS 1.0.0.71(SP2)
  3. python实现http协议_python使用socket实现TCP支持HTTP协议的静态网页服务器
  4. 【iMX6ULL核心板】一款高性能低功耗的IMX6ULL核心板 | 触觉智能NXP IMX6ULL核心板
  5. Singing Everywhere
  6. ReactJS入门之生命周期
  7. 9月数据库排行:Microsoft SQL Server分数罕见下滑
  8. 计划Java EE 7批处理作业
  9. python读取大文件内容_python读取大文件
  10. 2013年4月管理计算机应用,全国2013年4月高等教育自学考试管理系统中计算机应用试题及答案...
  11. C++构造函数与析构函数调用虚函数的注意事项
  12. su室外渲染参数设置_紫天资源星球下载:多层公寓楼室外Lumion预渲染场景
  13. mvc 生成输出url
  14. U盘PE删除影子系统(PowerShadow),解决安装后重启蓝屏的问题
  15. VS2017各版本区别
  16. 奥西750服务器系统,奥西TDS750驱动
  17. LaTeX插入矩阵和方程组
  18. excel转换mysql建表_把 excel 和 mysq l数据库相互转换
  19. 【工作】python识别不同国家语言类型
  20. Vue全家桶入门精细讲解

热门文章

  1. 戴尔服务器安装独显后无显示,在T630服务器上安装了独立显卡,重启后液晶面板显示“pci1318 fatal error on bus 128d”,然后黑屏重启,该问题如何解决阿。...
  2. mac电脑解压缩报错:错误22 无效的参数
  3. Netcat工具的玩法
  4. CentOS7.5搭建Heartbeat+DRBD+NFS高可用共享存储
  5. mac上设置ms office word初始窗口大小
  6. 优麒麟服务器配置备忘
  7. Databricks 第5篇:Databricks文件系统(DBFS)
  8. 推荐一个开源U盘启动工具——Ventoy
  9. 拍手数据集_我如何(重新)建立中等拍手效果-以及从实验中得到的结果。
  10. SpringMVC数据接收及传递