最小生成树(Minimum Spanning Tree,MST)是图论中的一个重要概念,它指的是在一个加权无向连通图中,包含图中所有顶点的、权值之和最小的生成树。
算法
解决最小生成树问题常用的算法有:
- Prim算法
- Kruskal算法
下面分别介绍这两种算法。
Prim算法
Prim算法是一种贪心算法,它从一个顶点开始,逐步增加边,直到所有顶点都被包含在生成树中。
- 选择一个顶点作为起点。
- 将该顶点加入生成树中。
- 从生成树中找到一个与未加入生成树的顶点相连的最小权值边,将该边加入生成树中。
- 重复步骤3,直到所有顶点都被包含在生成树中。
Kruskal算法
Kruskal算法也是一种贪心算法,它按照边的权值大小进行排序,然后逐步选择边,直到所有顶点都被包含在生成树中。
- 将所有边按照权值大小进行排序。
- 遍历排序后的边,对于每条边:
- 如果这条边不会形成环,则将其加入生成树中。
- 如果这条边会形成环,则跳过这条边。
- 重复步骤2,直到所有顶点都被包含在生成树中。
代码示例
以下是一个使用Prim算法求解最小生成树的Python代码示例:
def prim(graph):
n = len(graph)
mst = [[0] * n for _ in range(n)]
visited = [False] * n
min_edge = [float('inf')] * n
min_edge[0] = 0
for i in range(n):
u = min_edge.index(min(min_edge))
visited[u] = True
for v in range(n):
if not visited[v] and graph[u][v] < min_edge[v]:
min_edge[v] = graph[u][v]
mst[u][v] = 1
mst[v][u] = 1
return mst
# 示例图
graph = [
[0, 2, 0, 6, 0],
[2, 0, 3, 8, 5],
[0, 3, 0, 0, 7],
[6, 8, 0, 0, 9],
[0, 5, 7, 9, 0]
]
# 输出最小生成树
mst = prim(graph)
for row in mst:
print(row)
扩展阅读
更多关于最小生成树的信息,请访问本站图论教程。