LeetCode 中等难度 - 最小生成树 (Minimum Spanning Tree)
最小生成树(Minimum Spanning Tree,简称MST)是图论中的一个重要概念。它是指在一个加权无向连通图中,包含图中所有顶点的、权值之和最小的生成树。
常见算法
克鲁斯卡尔算法(Kruskal's Algorithm)
- 从所有边中按权重顺序选择,每次选择一条最小的边,但这条边不能构成环。
- 时间复杂度:(O(E \log E)),其中E是边的数量。
普里姆算法(Prim's Algorithm)
- 从一个顶点开始,逐步增加边,直到包含所有顶点。
- 时间复杂度:(O(E \log V)),其中V是顶点的数量。
代码示例(Python)
以下是一个使用克鲁斯卡尔算法求解最小生成树的Python代码示例:
class Graph:
def __init__(self, vertices):
self.V = vertices
self.graph = []
def add_edge(self, u, v, w):
self.graph.append([u, v, w])
def find(self, parent, i):
if parent[i] == i:
return i
return self.find(parent, parent[i])
def union(self, parent, rank, x, y):
rootx = self.find(parent, x)
rooty = self.find(parent, y)
if rank[rootx] < rank[rooty]:
parent[rootx] = rooty
elif rank[rootx] > rank[rooty]:
parent[rooty] = rootx
else:
parent[rooty] = rootx
rank[rootx] += 1
def kruskal_mst(self):
result = []
i, e = 0, 0
self.graph = sorted(self.graph, key=lambda item: item[2])
parent = []
rank = []
for node in range(self.V):
parent.append(node)
rank.append(0)
while e < self.V - 1:
u, v, w = self.graph[i]
i = i + 1
x = self.find(parent, u)
y = self.find(parent, v)
if x != y:
e = e + 1
result.append([u, v, w])
self.union(parent, rank, x, y)
return result
g = Graph(4)
g.add_edge(0, 1, 10)
g.add_edge(0, 2, 6)
g.add_edge(0, 3, 5)
g.add_edge(1, 3, 15)
g.add_edge(2, 3, 4)
print("边的权重和最小生成树:")
mst = g.kruskal_mst()
for u, v, weight in mst:
print(f"{u} - {v} ({weight})")
扩展阅读
[
Minimum Spanning Tree