算法练习:最小生成树 (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 ...
随机推荐
- cocos2d-html5模板分析
结构总览 js文件 src/myApp.js src/resource.js cocos2d.js cocos2d-jsb.js main.js 其他文件 build.xml index.html 具 ...
- base64 图片编码之再优化
首先进入网站: http://b64.io/ 最多可减少图片体积容量近70%,建议不要优化base 64 图片格式为gif , 已实测如果用gif的话会增加容量.
- PyQt5教程——组件 Ⅱ(八)
这部分的教程将会继续介绍PyQt5的组件.我们这节教程的内容将包括像素图(QPixmap),单行文本框(QLineEdit)和下拉列表框(QComboBox) 像素图(QPixmap) 像素图(QPi ...
- 强制MySQL查询走索引和强制查询不缓存
有些情况下,表中创建了索引但是EXPLAIN的查看执行计划的时候发现并没有走索引.是因为优化器认为该语句不使用索引效率更好. 当然也可以强制走索引.类似: SELECT uid,uname FROM ...
- Eclipse中jar包关联JDK源代码
1.点 “window”-> "Preferences" -> "Java" -> "Installed JRES"2.此 ...
- openerp many2many
many2many (0,0,{values}) 根据values里面的信息新建一个记录. (1,ID,{values})更新id=ID的记录(写入values里面的数据) (2,ID) 删除id=I ...
- List(T)类的方法
List<T>.Clear 方法 List<T>.RemoveAll 方法 http://msdn.microsoft.com/zh-cn/library/s6hkc2c4(v ...
- eclipse 如何运行mavenWeb项目
1.使用maven 首先,在eclipse中,使用maven对项目进行打包: 其次,将项目发布到Tomcat服务器上 说明: demo_WebService2-0.0.1-SNAPSHOT文件夹存 ...
- 【Oracle】ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
早上使用PL/SQL连接Oracle的时候,报错如下 解决办法: 找到文件listener.ora,新增以下红色区域,注意:路径需要根据自己的Oracle安装路径自行设置 # listener.ora ...
- Python之zip
# -*- coding: utf-8 -*- #python 27 #xiaodeng #Python之zip #http://python.jobbole.com/82590/ #1)zip语法格 ...