Prim算法、Kruskai算法寻找最小生成树

Prim算法

什么是最小生成树?

例子:镇长管辖6个村落,分别是A村、B村、C村、D村、E村、F村。镇长住A村,他想去其他各个村落视察,但没有路过不去,所以要修路。但是两两村落间修路所需的钱不同,如下图所示:A村到B村需6万元,B村到C村需3万元……。村长是个小气鬼,想花最少的钱确保他能到每一个村落视察。

 

那么如何修路呢?

下面介绍用Prim算法修路,即寻找最小生成树

镇长到A村,先选择A村相邻花费最少的(1万)到F村,再选择F村相邻花费最少的(2万)到B村,再选择B村相邻花费最少的(3万)到C村,接下来C村只能选择到D村,但花费太多了(7明显在上图中不是个小数目),镇长不同意,故保留。接着往回退到F村,F村到D村(4万),D村到E村(2万)。即下图

 

 

 这样,镇长就能花最少的钱,愉快的到每个属于他的村落装13了。

PS:镇长不关心其余村落间方不方便,是不是花最少的钱,但是任一村落都是可以到其他所有结点的,只不过不是最便宜的。只关心他住的地方(A村)是不是花最少的钱能到每个村落。

 上图就是一个最小生成树,即花最少的钱修连接所有村落的路。 

最小生成树:边的权重之和最小的那棵生成树。

什么是生成树?

生成树是图的极小连通子图。极小连通子图,即任意掐断一条路,就会存在结点与其他结点断开;任意添加一条路,就会形成回路。

故最小生成树首先是生成树,其次是边的权重之和最小。

 

Kruskal算法

将森林构成一棵树。选权重最小的连接,如果构成了回路则放弃,继续找权重小的连接,直至成为一棵树。

 

 

先将权重最小的(权重是4)连接,再将权重5连接,权重6连接,此时不能连接权重7的,因为权重4,权重6已经连接,此时连接权重7则会形成回路,故放弃,再去将权重8的连接,权重10不能连接,权重5,权重8,权重10会形成回路。权重12连接,权重15不能连接,因为权重8,12,15会形成回路。权重18连接。

 

 此时结点1可到达所有的结点。最小生成树已经形成。

 

posted @ 2021-04-14 20:05  小狗吃月亮  阅读(144)  评论(0编辑  收藏  举报