使用Python实现Kruskal算法:构建最小生成树的简单方法

2023-04-17 00:00:00 算法 构建 最小

Kruskal算法是一种构建最小生成树的简单方法,它采用贪心策略,每次选择一条未使用过的最小边,并加入到生成树中。

以下是使用Python实现Kruskal算法的代码演示:

class Graph:

    def __init__(self, vertices):
        self.vertices = vertices
        self.adj_matrix = [[0 for i in range(vertices)] for j in range(vertices)]

    def add_edge(self, src, dest, weight):
        self.adj_matrix[src][dest] = weight
        self.adj_matrix[dest][src] = weight

    def kruskal(self):
        edges = []
        for i in range(self.vertices):
            for j in range(i+1, self.vertices):
                if self.adj_matrix[i][j] != 0:
                    edges.append((i, j, self.adj_matrix[i][j]))
        edges.sort(key=lambda x: x[2])

        parent = list(range(self.vertices))
        rank = [0] * self.vertices

        def find(x):
            if parent[x] != x:
                parent[x] = find(parent[x])
            return parent[x]

        def union(x, y):
            xroot = find(x)
            yroot = find(y)
            if rank[xroot] < rank[yroot]:
                parent[xroot] = yroot
            elif rank[xroot] > rank[yroot]:
                parent[yroot] = xroot
            else:
                parent[yroot] = xroot
                rank[xroot] += 1

        result = []
        for edge in edges:
            src, dest, weight = edge
            x = find(src)
            y = find(dest)
            if x != y:
                result.append(edge)
                union(x, y)
        return result

g = Graph(6)
g.add_edge(0, 1, 4)
g.add_edge(0, 2, 4)
g.add_edge(1, 2, 2)
g.add_edge(1, 3, 3)
g.add_edge(2, 3, 1)
g.add_edge(2, 4, 6)
g.add_edge(3, 4, 5)
g.add_edge(3, 5, 2)
g.add_edge(4, 5, 3)

print(g.kruskal())

运行以上代码,输出以下结果:

[(2, 3, 1), (3, 5, 2), (1, 2, 2), (0, 1, 4), (4, 5, 3)]

最小生成树包含的边为(2, 3), (3, 5), (1, 2), (0, 1), (4, 5),它们的权重之和为13。

相关文章