目录
最小生成树的概念与算法
最小生成树(Minimum Spanning Tree, MST)是一个连通图的生成树,其边的总权重最小。常用的算法有 Kruskal 算法和 Prim 算法。
Kruskal 算法
主要思想:全局最小值
算法实现:全局寻找最短的边,如果这个边不会与之前选择的所有边组成回路,就可以作为最小生成树的一部分;反之,舍去。
(b)选择最小的边<v1, v3>
(c)(d)(e)依次选择了最小的边,没有问题。未产生回路。
(f)两个5中,如果选择了<v3,v4>就会产生回路v1->v3->v4->v1,因此不可以选择这一条边;然后发现第二个5刚好没有产生回路,得到完整的生成树
Prim 算法
主要思想:贪婪算法
step1:
从节点v1开始,选择距离连通集{v1}最小的节点v2,把对应的节点加入节点集{v1, v3},对应的边加入我们的联通集
step 2:
选择距离节点集最近的节点v6,加入对应的边<v3,v6>到连通集中,v6加入节点集和连通集
step 3~5:
同样的方法扩大连通集和节点集,直到所有的节点都进入节点集,于是最小生成树就产生了。
python代码(networkx)
函数定义
主要用到了的是nx.minimum_spanning_tree()和nx.tree.minimum_spanning_edges()
import matplotlib.pyplot as plt
import networkx as nx
# 创建带权边的列表
weighted_edges = [(i, j, weight) for i, j, weight in [
(1, 2, 50), (1, 3, 60), (2, 4, 65), (2, 5, 40), (3, 4, 52),
(3, 7, 45), (4, 5, 50), (4, 6, 30), (4, 7, 42), (5, 6, 70)
]]
# 创建无向图并添加边
def create_and_add_edges():
G =