当前位置:网站首页 > R语言数据分析 > 正文

prim算法详解(prim算法adjvex)



普里姆算法(Prim算法),图论中的一种算法,可在加权连通图(即“带权连通图”)里搜索最小生成树。该算法的结果是一棵树。

该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(Robert C. Prim)独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。

生成树:包含图G中的所有顶点;任意两个顶点有唯一路径。
最小生成树:是生成树;在所有生成树中,各边的权值之和最小的那棵。

实际意义:从图G的整体来看,求得连接各个顶点所需的最小代价。例如:有n个城市,在这n个城市间修建高速公路有多种不同的方案(不同的距离)。怎样修(哪个方案)是最省距离的。

(注:N个顶点的图中,其最小生成树的边为N-1条,且各边之和最小。树的每一个节点(除根节点)有且只有一个前驱,所以,只有N-1条边。)

假设G=(V, {E})是连通网(网:带权图),TE是图G的最小生成树T的边(Edge)集合。V是图G的顶点的集合,E是图G的边的集合。算法从U={u0} (u0∈V),TE={}开始。重复执行下述操作

  • 在所有u∈U,v∈V-U的边(u, v)∈E中找一条代价(权值)最小的边(u0, v0)并入集合TE。
  • 同时v0并入U
  • 直至U=V为止。此时TE中必有n-1条边,则T=(V, {TE})为N的最小生成树。

由算法代码(见下文)中的循环嵌套可得知此算法的时间复杂度为O(n2)。

  • 在集合E中选取权值最小的边(u, v),u∈U,v∈V且v∉U。(如果存在多条满足前述条件,即权值相同的边,则可任意选取其中之一。)
  • 将v并入U,将(u, v)边加入TE。
    输出:用集合U和TE来描述所得到的最小生成树T。

图G的邻接矩阵

解释:adjVex[3]==0,表示(v0, v3),adjVex[5] == 0,表示(v0, v5)。lowCost[3] == ∞且adjVex[3] == 0,表示(v0, v3)边不存在;lowCost[5] == 11且adjVex[5] == 0,表示(v0, v5)边的权值为11。

如:邻接矩阵中的v0行,v0顶点与各顶点构成的边及其权值用下面这的方式表示:

示例一

(v0, v0, 0), (v0, v3, ∞), (v0, v5, 11)

在lowCost数组中0表示以该顶点为终点的边e已经并入图G的最小生成树T的边集合——TE集合,不需要再比较(搜索)由集合U中的顶点构成的各边的权值。而∞表示以该顶点为终点的边e不存在。

③操作:

1.上面示例一中,最小的权值为10,此时lowCost中下标k = 1,相应地adjVex[k]即adjVex[1] == 0,记录下此时的边为(v0, v1)。
2. 将adjVex[k]即adjVex[1]设为1,表示将顶点v1放入图G的最小生成树的顶点集合U中。
3.将lowCost[k]即lowCost[1]设为0,表示:
①以v1为终点的边已搜索。
②且相应地,令i = adjVex[k],则边(vi, vk)为最小生成树T中的一条边,放入TE(或此处程序中的直接输出)。
③将顶点v1放入集合U中(lowCost[1]中的值不会再发生变化)。













4.然后,将焦点转向顶点v1,看看从v1开始的边有哪些是权值小于从之前的顶点v0开始的边的。此时k == 1。则有以下过程:

由于lowCost[0]和lowCost[1]为0,所以从lowCost[2]开始比较权值。vex[1][2] == 18 < lowCost[2],意思是(v0, v2)==∞不存在这条边,(v1, v2) == 18,存在权为18的边(v1, v2),类似的还有vex[1][6] == 16 < lowCost[6]和vex[1][8] == 12 < lowCost[8]。
把k == 1赋值给
adjVex[2]、adjVex[6]和adjVex[8]。
把权值18、16和12赋值给
lowCost[2]、lowCost[6]和lowCost[8]。










更新后的权值数组和邻接顶点数组如下:

故下次循环从顶点v1为起点去搜索lowCost中权值最小的边。如此往复循环,直到图G中的每一个顶点都被遍历到。(邻接矩阵的每一行都被遍历到)

④输出:

C#代码:直接看Prim2这个方法即可。

 
  

TypeScript代码

 
  

参考资料:

到此这篇prim算法详解(prim算法adjvex)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • msvcp140.dll文件被占用(msvcr100.dll被占用)2025-11-19 08:36:06
  • qpainter绘制矩形(qpainter drawline)2025-11-19 08:36:06
  • resnet50网络结构(resnet50网络结构原理)2025-11-19 08:36:06
  • re-pro怎么读(adobepremierepro怎么读)2025-11-19 08:36:06
  • yarn 查看日志(查看yarn application)2025-11-19 08:36:06
  • druid连接池配置文件(druid连接池配置详解)2025-11-19 08:36:06
  • word文档多级列表怎么设置(word2019多级列表怎么设置)2025-11-19 08:36:06
  • gridlayout布局特点(gridlayout布局怎么用)2025-11-19 08:36:06
  • resnet网络结构详解(resnet34网络结构)2025-11-19 08:36:06
  • 最新越狱源(最新越狱源carplay)2025-11-19 08:36:06
  • 全屏图片