python和ruby实现最小生成树算法

问题:

有六个城市,之间的道路如上图所示。中间的数字表示,连接两个城市的建立道路所花费的金钱数。那么如何建立道路,才能在使用最小金钱的情况下,把各个城市都连接起来呢。

解决:

这是一个最小生成树问题。连接n个城市,最少需要n-1条道路。我们先把金钱数按从小到达排序,然后按金钱数从小到大选择对应的道路。这时我们会用到查并集的算法来判断两个城市是否已经联通,如果联通就查看下一条道路,否则将这条道路选择,并对这两个城市进行并集操作,直到我们得到n-1条道路。(大家可以去查看我之前关于查并集算法的文章。)

下面我们来看ruby和python的代码实现:

ruby实现:

我准备了三个文件:

其中data是用来记录数据的:

前两个数表示城市,第三个数代表金钱数。

quick_sort文件是快速排序算法

大家可以看前面的文章。用ruby实现算法3 快速排序

然后是我们的主程序了,首先是初始化部分:

接着是两个查并集的函数,大家可以看前面的文章:

然后是从data中读取数据,加入字典,将金钱数设为key值,将城市设为value。然后对key进行升序排序,根据这个顺序,计算查并集,选择路径。

但其实这个算法有个特别大的问题,就是把金钱设为key了,因为key值是不能重复的。应该把城市数组设为key值。但我懒得改了,留个大家尝试。

python实现

python实现和上面的思路一样,我们直接上代码

共三个文件

data与上面的一样。union.py我在前一个文章中讲过。

union.py

然后是make_tree.py文件。

这里使用了二维数组来处理数据。