(注:此贴是为了回答同事提出的一个问题而匆匆写就,算法代码只求得出答案为目的,效率方面还有很大的改进空间)

最小生成树是指对于给定的带权无向图,需要生成一个总权重最小的连通图。
其问题描述及算法可以详见: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)的更多相关文章

  1. Prim算法、Kruskal算法和最小生成树 | Minimum Spanning Tree

    graph to tree非常有趣! 距离的度量会极大地影响后续的分析,欧式距离会放大差异,相关性会缩小差异,导致某些细胞群分不开. 先直观看一下,第一个是Prim,第二个是Kruskal.但是肯定都 ...

  2. 【算法】关于图论中的最小生成树(Minimum Spanning Tree)详解

    本节纲要 什么是图(network) 什么是最小生成树 (minimum spanning tree) 最小生成树的算法 什么是图(network)? 这里的图当然不是我们日常说的图片或者地图.通常情 ...

  3. 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集

    最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...

  4. 最小生成树 (Minimum Spanning Tree,MST) --- Prim算法

    本文链接:http://www.cnblogs.com/Ash-ly/p/5409904.html 普瑞姆(Prim)算法: 假设N = (V, {E})是连通网,TE是N上最小生成树边的集合,U是是 ...

  5. 最小生成树 (Minimum Spanning Tree,MST) --- Kruskal算法

    本文链接:http://www.cnblogs.com/Ash-ly/p/5409265.html 引导问题: 假设要在N个城市之间建立通信联络网,则连通N个城市只需要N - 1条线路.这时,自然会考 ...

  6. 数据结构与算法分析–Minimum Spanning Tree(最小生成树)

    给定一个无向图,如果他的某个子图中,任意两个顶点都能互相连通并且是一棵树,那么这棵树就叫做生成树(spanning tree). 如果边上有权值,那么使得边权和最小的生成树叫做最小生成树(MST,Mi ...

  7. HDU 4408 Minimum Spanning Tree 最小生成树计数

    Minimum Spanning Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  8. 说说最小生成树(Minimum Spanning Tree)

    minimum spanning tree(MST) 最小生成树是连通无向带权图的一个子图,要求 能够连接图中的所有顶点.无环.路径的权重和为所有路径中最小的. graph-cut 对图的一个切割或者 ...

  9. 【HDU 4408】Minimum Spanning Tree(最小生成树计数)

    Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...

随机推荐

  1. 【Java VisualVM】使用 VisualVM 进行性能分析及调优

    转载:https://blog.csdn.net/lmb55/article/details/79267277 一.概述 开发大型 Java 应用程序的过程中难免遇到内存泄露.性能瓶颈等问题,比如文件 ...

  2. hadoop2.2.0_hbase0.96_zookeeper3.4.5全分布式安装文档下载

    本文档主要内容有: 1.hadoop 2.2.0 集群安装与部署 2.HBase 0.96 集群安装与部署 3.Zookeeper 3.4.5集群安装部署 备注:安装文档可能有所遗漏,后续将持续更新. ...

  3. 理解进程调度时机跟踪分析进程调度与进程切换的过程(Linux)

    ----------------------------------------------------------------------------------- 理解进程调度时机跟踪分析进程调度 ...

  4. 限制RICHTEXTBOX的输入的范围

        附件: http://files.cnblogs.com/xe2011/WindowsFormsApplication_LimitRichTextBoxInput.rar     using  ...

  5. 数据库 之 E-R实体关系模型

    E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型. 1.表示方法 E-R是描述现实世界概念结构模型的 ...

  6. poj 1879 Truck History

    本题链接:点击打开链接 题目大意: 输入n表示卡车辆数,输入每辆卡车编号.即长度为7的字符串,每辆卡车编号均可由其他类型编号衍生过来,求由当中一辆衍生出其他全部的最小衍生次数(有一个字符不同就需衍生一 ...

  7. java 散列与散列码探讨 ,简单HashMap实现散列映射表运行各种操作示列

    java 散列与散列码探讨 ,简单HashMap实现散列映射表运行各种操作示列 package org.rui.collection2.maps; /** * 散列与散列码 * 将土拔鼠对象与预报对象 ...

  8. 算法笔记_109:第四届蓝桥杯软件类省赛真题(JAVA软件开发本科B组部分习题)试题解答

    目录 1 马虎的算式 2 黄金连分数 3 有理数类 4 幸运数 5 连号区间数   前言:以下试题解答代码部分仅供参考,若有不当之处,还请路过的同学提醒一下~ 1 马虎的算式 标题: 马虎的算式 小明 ...

  9. rarcrack

    apt-get install rarcrack使用方法:rarcrack --threads xx --type rar xx.rar

  10. 减小App包的大小

    检查.ipa文件 首先获得app的ipa文件. 将ipa文件的后缀改为.zip,解压得到包内容. 查看资源文件哪个最大.然后试着对最大的文件即可处理 图片 尽量使用8-bit图片 使用8-bit的PN ...