让我们来谈谈最小生成树(Minimum Spanning Tree)算法

来源:互联网 发布:mac dock图标不显示 编辑:程序博客网 时间:2024/05/22 06:57

现实生活中我们往往会遇到类似于旅游路线规划,使用怎么样的一条旅游路线能够让我们花费最少的旅费获得一样的感受。这时如果你学过算法的话,恭喜你可以在女票面前大显生手了。这其实是一个最小生成树问题,可以利用Prim算法或者Kruskal算法解决。下面一一介绍这两种算法。

Prim算法包括两种不同的实现方式,其中一种叫做延时Prim算法,一种叫做即使Prim算法,两种算法的基本原理相同,只是实现过程中存在一定的差异而已,由于实现的禅意造成了算法性能发生了质的变化。

延时Prim算法,随机图中的某一点V,选择与V相邻的边中权重最小的边(V--W)加入最小生成树中,此时树种有两个点V,W,然后再选择与V,W两个点相邻的所有边中最小的边加入到最下生成树种,同时将边的另一个顶点加入到V,W构成的顶点集中,以此类推即可获得最下生成树。

为什么经过上述的操作之后能够得到最小生成树呢?这就涉及到切边的问题。为了更好的解释Prim算法,请看下图。

 

上图所示为获得一幅图中的最下生成树的过程,从左上角第一幅图开始,首先选择与顶点0距离最近的顶点1,然后将边(0--1)加入最小生成树,然后转到第3副图,此时与最小生成树相近的边如图中红线所示,选取权值最下的边(1--2)加入最小生成树,此时得到的最小生成树如图4所示,但是存在边(0--2)使得上述最小生成树为一个环,由于0,2两个顶点都加入了最小生成树,为此删除边(0--2),依次类推,即可得到此图的最小生成树。如右下角的图所示。

上图描述了使用Prim算法获得最小生成树的过程,算法的具体实现见附件。





由于时间原因,Kruskal算法的实现将在明天奉上。


1 0
原创粉丝点击