普里姆算法

假设G=(V,E)是一个具有n个顶点的连通网,T=(U,TE)是G的最小生成树,其中U是T的顶点集,TE是T的边集,U和TE的初始值为空。算法过程:

  1. 首先从V中任取一个顶点(假定v1),将它并入U中,此时U={v1}
  2. 然后只要U是V的真子集(即U⊂V),就从那些一个端点已在T中,别一个端点仍在T外的所有边中,找一条最短(即权值最小)边,假定为(vi,vj),其中vi ∈U,vj ∈V-U,并把边(vi,vj)和顶点vj分别并入T的边集TE和顶点集U,如此进行下去,每次往生成树里并入一个顶点和一条边,直到n-1次后把所有n个顶点都并入到生成树T的顶点集,此时U=V,TE中包含n-1条边,T就是最后得到的最小生成树。

prim算法的步骤:

1.将顶点集合分成两个部分——U(选中的部分),V(未选中的部分)

2.每次从两个部分中找出权值最小的边

3.相连的顶点划入U中

4.重复1,直到顶点全部划入U中。

为了方便实现算法,附设一个辅助数组minedge[vtxptr],记录从U到V-U具有最小代价的边(即权值最小的边)。对每个顶点v∈V-U,在辅助数组中存在一个minedge[v]分量。每个分量包括两个域:ver域存储该边附在U中的顶点,lowcost域则存储该边上的权值。

具体算法如下:

#include <stdio.h>
// 最大顶点数
#define MaxVertexNum 50typedef char VertexType;
typedef int Adjmatrix;
// 邻接矩阵
typedef struct {VertexType vex[MaxVertexNum];// 顶点数组,类型假定为charAdjmatrix arcs[MaxVertexNum][MaxVertexNum];// 邻接矩阵,类型假定为int
}MGraph;typedef int VRType;
typedef struct{VertexType ver;VRType lowcost;
}MinEdge[MaxVertexNum];
MinEdge minedge;// 从顶点集U到V-U的代价最小的边的辅助数组// 返回顶点u在MGraph的vex数组中的下标,以此作为顶点u在辅助数组中的下标
// 若G中存在顶点u,则返回该顶点在图中的位置;否则返回-1
int vtxNum(MGraph G,int u,int n){// u是顶点,n是图G的顶点总数int k;for(k = 0;k < MaxVertexNum;k++){if(G.vex[k] == u){return k;}}return -1;
}
int min(MGraph G,MinEdge MINI,int n){int i=0,j,k,min;while(!MINI[i].lowcost){i++;}min = MINI[i].lowcost;// 第一个不为0的值k=i;for(j = i+1;j < n;j++){if(MINI[j].lowcost > 0 && MINI[j].lowcost<min){min = MINI[j].lowcost;k=j;}}return k;// 返回最小值在辅助数组中的序号
}
void prim(MGraph G,VertexType u,int n){// G是采用邻接矩阵存储结构表示的图,u是顶点,n是顶点个数,以u作为出发点int k,v,j;k=vtxNum(G,u,n);// 取顶点u在辅助数组中的下标for(v = 0;v<n;v++){// 辅助数组初始化,v是每个顶点,此处是初始顶点u与顶点v的关系if(v!=k){minedge[v].ver = u;//顶点域全部赋值为u点minedge[v].lowcost = G.arcs[k][v];//距离域全部赋值为u到其他点的距离}}// 初始化,U={u}minedge[k].lowcost = 0;for(j = 0;j < n;j++){k=min(G,minedge,n);//k为辅助数组中值最小的点对应的序号printf("edge:%d-%d",minedge[k].ver,G.vex[k]);// 输出生成树的边minedge[k].lowcost = 0;// 第k顶点并入U集合for(v=0;v<n;v++){if(G.arcs[k][v] < minedge[v].lowcost){// 新顶点并入U集合后,重新选择最小边minedge[v].ver=G.vex[k];minedge[v].lowcost=G.arcs[k][v];}}}
}

推荐看一个视频:https://b23.tv/BV19J411n76b

最小生成树算法——普里姆算法相关推荐

  1. 数据结构(五)图---最小生成树(普里姆算法)

    一:最小生成树 (一)定义 我们把构造连通网的最小代价生成树称为最小生成树或给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树. (二)什么是最小生成树? 1. ...

  2. 用c语言描述普里姆算法和克鲁斯卡尔算法,克鲁斯卡尔算法+普里姆算法 详解

    克鲁斯卡尔算法: [1]克鲁斯卡尔算法 普里姆算法是以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 克鲁斯卡尔算法是直接以边为目标去构建. 因为权值是在边上,直接去找最小权值的边来构建生 ...

  3. 最小生成树之普里姆算法

    为了能够讲明白这个算法,我们先构造网图的邻接矩阵,如图7-6-3的右图所示. 也就是说,现在我们已经有了一个存储结构为MGraph的MG(见<邻接矩阵创建图>).MG有9个顶点,它的二维数 ...

  4. 最小生成树(克鲁斯卡尔算法 普里姆算法)

    最小生成树是处理图结构中,简化图的算法:即删除一些边使得图得以简化,但应保证图中任意点都是相连通的.形成的最小生成树应该使得从顶点遍历时走过边的权值和最小.(有n个节点,则最小生成树的边数应为n-1) ...

  5. 最小生成树(普里姆算法)

    关于什么是Prim(普里姆算法)? 在实际生活中,我们常常碰到类似这种一类问题:如果要在n个城市之间建立通信联络网, 则连通n个城市仅仅须要n-1条线路.这时.我们须要考虑这样一个问题.怎样在最节省经 ...

  6. 最小生成树:克鲁斯卡尔算法+普里姆算法

    目录 一.最小生成树 二.克鲁斯卡尔算法 1.思路 2.示例 3.C语言代码 三.普里姆算法 1.思路 2.C语言代码 一.最小生成树 一棵最小生成树需要满足哪些条件呢? 不存在回路 对于具有n个顶点 ...

  7. 算法 - 普里姆算法(修路问题求解)

    从A开始,A作为定点,找到与A相连并且未被处理(不在顶点集合中)的进行处理,找到权值最小的并加入集合,A-C[7].A-G[2].A-B[5],最小的是A-G[2],所以把G加入集合,这里是有A-G的 ...

  8. 【数据结构】最小生成树(Prim算法,普里姆算法,普利姆)、最短路径(Dijkstra算法,迪杰斯特拉算法,单源最短路径)

    文章目录 前置问题 问题解答 一.基础概念:最小生成树的定义和性质 (1)最小生成树(Minimal Spanning Tree)的定义 (2)最小生成树(MST)的性质 二.如何利用MST性质寻找最 ...

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

    图论中的一种算法,可在加权连通图里搜索最小生成树.由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小. 算法描述 1).输入:一个加权连通图,其中顶点集合为 ...

最新文章

  1. 【Qt】Ubuntu18.04下解决Qt出现qt.qpa.plugin:Could not load the Qt platform plugin “xcb“问题
  2. 广度深度都要,亚马逊是如何推动 Alexa 内生成长的?
  3. mysql hive 内置函数_Hive中与时间相关的内置函数
  4. Linux中find命令详解
  5. 老生又长谈:HttpApplication,HttpModule,HttpContext及Asp.Net页生命周期
  6. java 读取properties文件
  7. 指定module_一个缺失已久的特性 — module模块
  8. Bailian4134 查找最接近的元素【二分查找】
  9. 在Windows下使用安装并启动HDFView踩坑记录
  10. mysql数据库技术与应用微课版 pdf_MySQL数据库原理与应用(微课版)
  11. 从零開始搭建微信硬件开发环境全过程——1小时掌握微信硬件开发流程
  12. 国企程序员可以干多久
  13. Codeforces Edu:双指针 » Step 3 » Practice:A. Looped Playlist
  14. Excel中万能的查询函数——VLOOKUP
  15. 如何用powershell安装2345推广软件
  16. 华为宣布出售荣耀,声明来了
  17. CollapsingToolbarLayout 标题字体及颜色设置
  18. python把excel变成ppt_【转】使用Python转换PDF,Word/Excel/PPT/md/HTML都能转!
  19. miniui动态生成列
  20. 报告指出,中国市场巩固了作为智利车厘子全球主要出口目的国的市场地位

热门文章

  1. 工地上的石头太硬挖机打不动怎么办
  2. 阿里云+宝塔+狂雨小说CMS:搭建小说网站
  3. element刷新表单校验
  4. PCIE AER Linux 驱动详解
  5. 超融合只是打地基,而Nutanix现在要“盖房子”
  6. video 微信 标签层级过高_标签Tag在用户决策中的作用
  7. 通过BitSet源码来理解BitMap算法
  8. Linux命令之mkdir
  9. 智能手机背后的利益链:赚了满钵的供应商,提心吊胆的新技术者
  10. mysql 错误 ERROR 2006 (HY000)