普里姆算法

author author     2023-05-11     629

关键词:

void prim(int c[7][7],int n)//普里姆算法

int lowcost[7],closest[7];
int i,j,k,min;
for(i=2;i <=n;i++)//赋值 从顶点1开始

lowcost[i]=c[1][i];
closest[i]=1;

for(i=2; i <=n; j++)//从U之外求离U中某一点最近的顶点

k=i;
min=lowcost[i];
for(j=2; j <=n; j++)
if(min> lowcost[j])

min=lowcost[j];
k=j;

cout < <k < <closest[j] < <endl;//打印边
lowcost[k]=32767;//将k加入到U中
for(j=2; j <=n; j++)
if(c[k][j] <lowcost[j]&&lowcost[j] <32767)

lowcost[j]=c[k][j];
closest[j]=k;



但我有点看不懂.....
for(j=2; j <=n; j++)
if(c[k][j] <lowcost[j]&&lowcost[j] <32767)

lowcost[j]=c[k][j];
closest[j]=k;

是什么意思?书上说是修改lowcost和closest数组,可我还是不明白为什么要修改,if里的判断条件也不清楚,好心人就跟我说说吧!最好能举个例子,别太抽象,行不? (*^__^*)
懂了,但我总感觉,算法好像没算完,到后面算出来最小顶点后,它又回到那开始执行呢?

你要先明白prim算法的原理,明白原理后看下面的程序要点:

1.程序实现的时候将点分成两部分,加入集合的和没有加入集合的;
2.每次从没有加入集合中找点;
3.对所有没有加入到集合中的点中,找一个边权最小的;
4.将边权最小的点加入集合中,并且修改和加入点相连的没有加入的点的权,重复第2步,知道所有的点都加入到集合中;
参考技术A 可以这么理解:因为最小生成树是包含所有顶点的所以开始lowcost先储存到第一个点的所有值,然后执行下面算法,找到最小值并记录是第几个点,比如说这个点是3,这样有了一条1-3得道路已经确定,现在从3出发找从3出发到其他顶点的路径,如果这个从3出发到达的路径长度比从1出发的短,则更新lowcost,这样使得lowcost保存一直到达该顶点的最短路径。比如1-4是5,3-4是4,则lowcost从原来的5被改为4。 参考技术B prim算法是一种贪心算法。Prim算法以任意一个结点为起点,把它加入Q,然后每一步连接一条边,这条边是Q中全部结点对外的边中最小的一条。就是说,我们每次通过新增一个从Q连到外面S的边来把一个S中的结点加入Q。
首先你要明白lowcost和closest数组的意思。lowcost是指当前已进入最小生成树的顶点和未进入最小生成树的顶点间的最小边距离,如果lowcost等于32767,就表示目前的以确定的生成树部分,和该顶点没有变相连。closest记录的则是和当前生成树距离最近的顶点的编号。
你说看不懂的那部分,是对lowcost和closest数组进行更新的操作,因为每一步都会有一个新的顶点进入当前最小生成树,所以要用刚刚进入的这个顶点对还未进入的顶点的距离进行更新。、

用两个辅助数组:
1 lowcost : 记录个顶点到生成树的最近距离,若Vi已经进入生成树,则lowcost = 0;否则,lowcost = 边(Vi,Vj)的权值,其中 j = closest; 在所有与Vi关联的另一个顶点不再生成树的边中,(Vi,Vj)具有最小的权值.
算法具体操作:
1 closet数组中的每个元素都设置为x,其中x为进入节点,lowcost数组中的值:如果(Vx,Vi)是边,就是这条边的权值,如果(Vx,Vi)不是边,而且i!=x就是正无穷大。
2 每次从lowcost中找一个最小的i,lowcost(i)设置为0, 然后检查lowcost数组中所有的大于0的元素lowcost[k],如果(Vi,Vk)<lowcost[k],则把lowcost[k] = (Vi,Vk),并且closet[k] = i,最后当网络中n个顶点全部进入生成树,整个构造过程结束,此时,所有的lowcost都是0,最小生成树的所有边都在closet中,他们是(Vi,closet),当Vi和 closet不是一个点。
-------------------------------------------------
为什么又回到开始呢?因为每步最后的更新过程后,只是计算了现在的生成树和未加入生成树的点集之间的最小距离,所以下一次还要在这些距离里面找到最小的。prim如果生成的是n个点的生成树,那么肯定只执行n-1次,因为每次加入一条边!
参考技术C if中的判断语句:
1 lowcost[j] < 32767 说明j这个节点还没有被加到U中,因为你每次向U中加一个新节点时都将lowcost[k] 赋值为32767.
2 c[k][j] < lowcost[j].对于新加入了一个节点,有可能这个节点的加入会使原来的未加入U的节点的lowcost值发生改变。例如: 开始时候U中除了节点1外没有别的节点,其他的2到n个节点的lowcost[j] 值分别为c[1][j].假如第二次向U中加人了节点2,那么U变成了{1,2} 对于3到n这些节点,可能有节点j满足:
c[2][j] < c[1][j] ,这时就需要更新节点j的lowcost 值和closest 值。
lowcost[j] = c[2][j], closest[j] = 2;因为要保证每个节点到集合U的距离是最小的。prim 算法的基本思想就是贪心,每次找最小的边。

不知道这样解释你能否明白,可以再交流!

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

普利姆算法生成最小树,当两个节点之间没有边时,权值为65535,结点与自身之间为0.。。。#defineMAXSIZE10typedefstructGraph{inttable[MAXSIZE][MAXSIZE];intnum;}Graph;voidcreateTable(Graph*graph);voidprintTable(Graph*graph);voidprim(Graph*graph); 查看详情

普里姆prim算法介绍

普里姆(Prim)算法,和克鲁斯卡尔算法一样,是用来求加权连通图的最小生成树的算法。基本思想 对于图G而言,V是所有顶点的集合;现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G的最小生成树... 查看详情

学习笔记:普里姆算法

一、算法描述1.初始化最小生成树仅包含图中的任意顶点,不包含任何边。2.从图中选择一条权值最小的边,该边有且仅有一个顶点在最小生成树中。将该边加入最小生成树中。3.重复上一步直到图中所有的顶点都在最小生成树中... 查看详情

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

所谓生成树,就是n个点之间连成n-1条边的图形。而最小生成树,就是权值(两点间直线的值)之和的最小值。           首先,要用二维数组记录点和权值。如上图所示无向图:intmap[7][7];&... 查看详情

普里姆prim算法-图解最小生成树

...nningTree)。找连通图的最小生成树,经典的有两种算法,普里姆算 查看详情

数据结构-最小生成树-普里姆算法(代码片段)

 转自https://blog.csdn.net/ZGUIZ/article/details/54633115首先仍然是预定义:1#defineOK12#defineERROR03#defineMax_Int327674#defineMVNum10056typedefintStatus;7typedefcharVerTexType;8typedefintArcType;910struct 查看详情

最小生成树普里姆算法和克鲁斯卡尔算法

...:①输入并存储至少8个顶点14条边的无向图。②分别编写普里姆算法和克鲁斯卡尔算法,求出最小生成树,输出最小生成树的生成过程。好的有追分我要源程序代码大牛们kruskal算法的时间复杂度主要由排序方法决定,其排序算... 查看详情

数据结构之最小生成树(普里姆算法)(代码片段)

1)普里姆算法可取图中任意一个顶点v作为生成树的根,之后若要往生成树上添加顶点w,则在顶点v和顶点w之间必定存在一条边,并且该边的权值在所有连通顶点v和w之间的边中取值最小。一般情况下,假设n个顶点分成两个集合... 查看详情

普里姆算法与修路问题(代码片段)

...条边都在图中举例说明(如图:)求最小生成树的算法主要是普里姆算法和克鲁斯卡尔算法思路:将10条边,连接即可,但是总的里程数不是最小.正确的思路,就是尽可能的选择少的路线,并且每条路线最小,保证总里程数最少. ... 查看详情

数据结构图---最小生成树(普里姆算法)(代码片段)

一:最小生成树(一)定义我们把构造连通网的最小代价生成树称为最小生成树(二)什么是最小生成树?1.是一棵树1)无回路2)N个顶点,一定有N-1条边2.是生成树1)包含全部顶点2)N-1条边都在图中3.边的权重和最小(三)案... 查看详情

普里姆算法

voidprim(intc[7][7],intn)//普里姆算法intlowcost[7],closest[7];inti,j,k,min;for(i=2;i<=n;i++)//赋值从顶点1开始lowcost[i]=c[1][i];closest[i]=1;for(i=2;i<=n;j++)//从U之外求离U中某一点最近的顶点k=i;min=lowcost[i];for(j=2;j<=n;j++)if(min>lowcost[j])min=lowcost[j];k=j... 查看详情

最小生成树普里姆算法有问

无向网络从顶点V3开始用普里姆方法求其最小生成数,画出最小生成树的构造过程。我知道最后的构造过程是,但他连接的不是连接那圆圈中最小的圆圈么?为什么到圆圈6后连接了4,没有从4那连接2,而是从6那连接3?而且1还连... 查看详情

最小生成树之prim算法

       普里姆算法(Prim算法),图论中的一种算法。可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包含了连通图里的全部顶点。且其全部边的权值之和亦为最... 查看详情

利用普里姆算法求解最小生成树,写出步骤或画图表示过程。

利用普里姆算法求解最小生成树,写出步骤或画图表示过程。参考技术A<1,6>边长度未知,这里看成无穷大。历次循环中,选择两端点分别在U,V中的边中长度最小者,具体如下:1.将1加入U中,其余点加入V中。2.选择边<1,7&g... 查看详情

普利姆算法

普里姆(Prim)算法,和克鲁斯卡尔算法一样,求加权连通图的最小生成树的算法。下面对算法的图例描述? 查看详情

最小生成树-prim算法和kruskal算法

Prim算法1.概览普里姆算法(Prim算法)。图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中。不但包括了连通图里的全部顶点(英语:Vertex(graphtheory)),且其全部边的权值之和亦... 查看详情

最小生成树

...MST)。 二、构造算法有两种算法来构造最小生成树:普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法。三、普里姆(Prim)算法算法步骤:1、在图G=(V,E)(V 查看详情

最小生成树-prim算法和kruskal算法(代码片段)

Prim算法1.概览普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex(graphtheory)),且其所有边的权值之和亦... 查看详情