算法练习:最小生成树 (Minimum Spanning Tree)
(注:此贴是为了回答同事提出的一个问题而匆匆写就,算法代码只求得出答案为目的,效率方面还有很大的改进空间)
最小生成树是指对于给定的带权无向图,需要生成一个总权重最小的连通图。
其问题描述及算法可以详见:https://en.wikipedia.org/wiki/Minimum_spanning_tree
以下我选用其中一个简单的算法描述,编写 Python 代码尝试解决此问题。
下面是同事提出的问题的原图:
程序:
# coding: utf-8 from sets import Set def edge_name(v1, v2):
if v1 < v2:
return v1 + v2
return v2 + v1 # Prim algorithm
def mst(vectors, costs, vectors_in_g, edges_in_g):
if len(vectors) == len(vectors_in_g):
return (vectors_in_g, edges_in_g) min_cost = max(costs.values()) + 1
remaining_vectors = vectors.difference(vectors_in_g)
next_vector = ''
next_edge = '' for x in vectors_in_g:
for y in remaining_vectors:
ename = edge_name(x, y)
if ename not in costs:
continue
cost = costs[ename]
if cost < min_cost:
next_vector = y
next_edge = ename
min_cost = cost if next_vector <> '' and next_edge <> '':
new_vectors_in_g = vectors_in_g.copy()
new_edges_in_g = edges_in_g[:]
new_vectors_in_g.add(next_vector)
new_edges_in_g.append(next_edge) return mst(vectors, costs, new_vectors_in_g, new_edges_in_g)
else:
raise Exception("The MST can not be found.") my_vectors = Set(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
my_costs = {
'ab': 12,
'ad': 11,
'ae': 16,
'ag': 14,
'bc': 11,
'bd': 13,
'cd': 13,
'cf': 15,
'df': 16,
'ef': 15,
'eg': 10,
'fg': 14
} vs, es = mst(my_vectors, my_costs, Set(list(my_vectors)[0]), []) print vs
print es total_cost = 0
for e in es:
total_cost += my_costs[e] print total_cost
程序输出如下:
Set(['a', 'c', 'b', 'e', 'd', 'g', 'f'])
['ad', 'ab', 'bc', 'ag', 'eg', 'fg']
72
从输出结果可知最优解的总权重72. 图示如下:
算法练习:最小生成树 (Minimum Spanning Tree)的更多相关文章
- Prim算法、Kruskal算法和最小生成树 | Minimum Spanning Tree
graph to tree非常有趣! 距离的度量会极大地影响后续的分析,欧式距离会放大差异,相关性会缩小差异,导致某些细胞群分不开. 先直观看一下,第一个是Prim,第二个是Kruskal.但是肯定都 ...
- 【算法】关于图论中的最小生成树(Minimum Spanning Tree)详解
本节纲要 什么是图(network) 什么是最小生成树 (minimum spanning tree) 最小生成树的算法 什么是图(network)? 这里的图当然不是我们日常说的图片或者地图.通常情 ...
- 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集
最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...
- 最小生成树 (Minimum Spanning Tree,MST) --- Prim算法
本文链接:http://www.cnblogs.com/Ash-ly/p/5409904.html 普瑞姆(Prim)算法: 假设N = (V, {E})是连通网,TE是N上最小生成树边的集合,U是是 ...
- 最小生成树 (Minimum Spanning Tree,MST) --- Kruskal算法
本文链接:http://www.cnblogs.com/Ash-ly/p/5409265.html 引导问题: 假设要在N个城市之间建立通信联络网,则连通N个城市只需要N - 1条线路.这时,自然会考 ...
- 数据结构与算法分析–Minimum Spanning Tree(最小生成树)
给定一个无向图,如果他的某个子图中,任意两个顶点都能互相连通并且是一棵树,那么这棵树就叫做生成树(spanning tree). 如果边上有权值,那么使得边权和最小的生成树叫做最小生成树(MST,Mi ...
- HDU 4408 Minimum Spanning Tree 最小生成树计数
Minimum Spanning Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- 说说最小生成树(Minimum Spanning Tree)
minimum spanning tree(MST) 最小生成树是连通无向带权图的一个子图,要求 能够连接图中的所有顶点.无环.路径的权重和为所有路径中最小的. graph-cut 对图的一个切割或者 ...
- 【HDU 4408】Minimum Spanning Tree(最小生成树计数)
Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...
随机推荐
- 【js】利用闭包消除回调函数启动时值已经发生变化的影响
在以下代码中,timeFun异步执行了一个匿名函数,当输出color的值时已经由green变成red,因此输出为red. function timedFun(callback){ setTimeout ...
- C#.NET常见问题(FAQ)-想要另存一个项目,sln文件丢了怎么办,如何打开高版本的项目
如下图所示,我想要另存一个工程,把 V4.4整个的项目另存为V4.5,我可以把解决方案文件(.sln)改名字,但是我没法把文件夹改名字,改了打开sln就说找不到. 很简单的一个思路是反正sln是多 ...
- C#.NET常见问题(FAQ)-如何把写好的类编译成dll文件
1 新建一个类库项目 2 直接改写这个Class1.cs文件 3 记得要添加Windows.Forms引用 4 我直接把在别的项目中做好的cs文件搞到这里来,连文件名也改了(FilesDi ...
- 在windows下安装redmine及相关问题
转载注明出处,adousen的博客http://blog.csdn.net/adousen redmine是一个ticket驱动项目管理工具,与trac等工具相比.它最大特色是能够在一个实例中同一时候 ...
- 使用第三方类、库需要注意的正则类RegexKitLite的使用
一.到http://regexkit.sourceforge.net/下载RegexKitLite类,添加到项目中: 因为RegexKitLite使用ICU库,所以需要动态链接到/usr/lib/li ...
- uni-app 如何引入全局方法或变量?
利用Vue.prototype挂载到Vue实例上即可
- 选择合适的Linux版本
以下纯属个人想法:欢迎指正 1.Linux桌面系统,首选Ubuntu.当然Ubuntu也有服务器版本,不建议使用 2.服务端的Linux稳定的服务器系统,在企业中从事运维工作Redhat或者CentO ...
- Cannot load supported formats: Cannot run program "svn"
Cannot load supported formats: Cannot run program "svn" CreateTime--2018年4月26日11:32:37 A ...
- Knockout自定义绑定my97datepicker
/* my97datepicker 时间格式'yyyy-MM-dd HH-mm-ss' */ ko.bindingHandlers.datetimes = { init: function (elem ...
- Socket实现服务器与客户端的交互
连接过程: 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认. (1)服务器监听:是服务器端套接字并不定位具体的客户端套接 ...