2744557306 发表于 2024-3-14 10:21

Kruskal算法生成最小生成树 实例

Kruskal算法是一种贪心算法,用于找到连接的加权图的最小生成树。它找到了一组边,形成了一个包含每个顶点的树,树中所有边的总权重被最小化。
以下是Kruskal算法的简要概述:

1.排序边: 将所有边按照权重的非递减顺序排序。
2.初始化: 创建一个森林(一组树),其中每个顶点都是一个单独的树。
3.遍历边: 遍历所有边,从最小权重到最大权重。
4.检查环路: 对于每条边,如果将其包含在生成树中不会导致环路,则将其添加到生成树中。否则,丢弃它。
5.合并: 如果将边添加到生成树中,则执行合并操作,将两棵树合并为一棵树。

以下是Kruskal算法的Python实现:class Graph:

    def __init__(self, vertices):

        self.V = vertices

        self.graph = []



    def add_edge(self, u, v, w):

        self.graph.append()



    def find(self, parent, i):

        if parent == i:

            return i

        return self.find(parent, parent)



    def union(self, parent, rank, x, y):

        x_root = self.find(parent, x)

        y_root = self.find(parent, y)



        if rank < rank:

            parent = y_root

        elif rank > rank:

            parent = x_root

        else:

            parent = x_root

            rank += 1



    def kruskal_minimum_spanning_tree(self):

        result = []

        i, e = 0, 0



        self.graph = sorted(self.graph, key=lambda item: item)

        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 += 1

            x = self.find(parent, u)

            y = self.find(parent, v)



            if x != y:

                e += 1

                result.append()

                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("最小生成树的边:")

print(g.kruskal_minimum_spanning_tree())这段代码定义了一个Graph类,其中包含添加边的方法、查找节点的父节点的方法、执行并操作的方法以及使用Kruskal算法查找最小生成树的方法。


页: [1]
查看完整版本: Kruskal算法生成最小生成树 实例