图论算法经典:Kruskal 算法实现最小生成树
在图论中,最小生成树(Minimum Spanning Tree,MST)是一个非常重要的概念。它指的是在一个无向、连通的图中,包含图中所有顶点的、权值之和最小的生成树。最小生成树在计算机科学、网络设计、数据结构等领域有着广泛的应用。本文将围绕最小生成树的概念,重点介绍Kruskal算法的实现。
Kruskal算法概述
Kruskal算法是一种基于贪心策略的最小生成树算法。其基本思想是:按照边的权重从小到大排序,每次选择一条当前最小的边,如果这条边不会与已选择的边形成环,则将其加入最小生成树中。重复此过程,直到所有顶点都被包含在最小生成树中。
Kruskal算法步骤
1. 将所有边按照权重从小到大排序。
2. 初始化一个空的最小生成树T。
3. 遍历排序后的边,对于每条边:
a. 检查这条边是否与T中的边形成环。
b. 如果不形成环,将这条边加入T中。
4. 重复步骤3,直到T中包含所有顶点。
Kruskal算法实现
下面是使用Python语言实现的Kruskal算法:
python
class Edge:
def __init__(self, src, dest, weight):
self.src = src
self.dest = dest
self.weight = weight
class Graph:
def __init__(self, vertices):
self.V = vertices
self.graph = []
def add_edge(self, src, dest, weight):
self.graph.append(Edge(src, dest, weight))
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 = 0
e = 0
Step 1: Sort all the edges in non-decreasing order of their weight.
self.graph = sorted(self.graph, key=lambda item: item.weight)
parent = []
rank = []
for node in range(self.V):
parent.append(node)
rank.append(0)
while e < self.V - 1:
Step 2: Pick the smallest edge.
current_edge = self.graph[i]
i = i + 1
x = current_edge.src
y = current_edge.dest
Step 3: Check if the edge creates a cycle with the spanning tree formed so far.
if self.find(parent, x) != self.find(parent, y):
e = e + 1
result.append(current_edge)
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)
打印最小生成树
mst = g.kruskal_mst()
print("Edge tWeight")
for edge in mst:
print(f"{edge.src} - {edge.dest} t{edge.weight}")
Kruskal算法分析
1. 时间复杂度:Kruskal算法的时间复杂度主要取决于排序过程,即O(ElogE),其中E为边的数量。
2. 空间复杂度:Kruskal算法的空间复杂度为O(V),其中V为顶点的数量。
总结
Kruskal算法是一种简单且有效的最小生成树算法。它适用于边数较多、顶点数较少的图。在实际应用中,Kruskal算法可以用于网络设计、数据结构等领域。相信读者对Kruskal算法有了更深入的了解。
Comments NOTHING