Python数据结构与算法:Kruskal算法的实现与应用
Kruskal算法是一种用于解决最小生成树问题的贪心算法。该算法的基本思想是从小到大地加边,并且加入的边不能形成环。通过这种方式,可以构造出整个图的最小生成树。
Kruskal算法实现流程:
- 将图中的所有边按照边权从小到大排序。
- 创建一个空的集合,用于存放已经加入到最小生成树中的顶点。
- 依次遍历每一条边,将其加入到最小生成树中,如果这条边的两个端点不在同一个集合中,则将这条边加入到集合中,并且把这两个端点放在同一个集合中。如果这条边的两个端点已经在同一个集合中,则不需要加入。
- 重复步骤3,直到所有的边都被遍历过为止。
Kruskal算法的应用场景比较广泛,例如在网络设计、交通规划等领域中都可以使用Kruskal算法来构造图的最小生成树。
下面给出Python实现Kruskal算法的代码示例:
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): xroot = self.find(parent, x) yroot = self.find(parent, y) if rank[xroot] < rank[yroot]: parent[xroot] = yroot elif rank[xroot] > rank[yroot]: parent[yroot] = xroot else : parent[yroot] = xroot rank[xroot] += 1 def KruskalMST(self): result = [] i = 0 e = 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) sum_weight = 0 for u, v, weight in result: sum_weight += weight return sum_weight, 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(g.KruskalMST())
以上代码实现了Kruskal算法,并且应用到具体的图中进行了验证。在这个例子中,我们构造了一个四个顶点的无向图,并且通过Kruskal算法求出了图的最小生成树及其权值。
相关文章