数据结构与算法之算法 图论算法经典 最小生成树 / Kruskal 算法

数据结构与算法阿木 发布于 2025-07-11 13 次阅读


图论算法经典: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算法有了更深入的了解。