더북(TheBook)

코드 13-7

    def MST_kruskal(self):
        mst = Graph(self.vertex_num) ➊ 
        ds = DisjointSet(self.vertex_num) ➋
        self.edge_list.sort(key=lambda e: e.w) ➌
        mst_edge_num = 0 ➍
        edge_idx = 0 ➎

        while mst_edge_num < self.vertex_num-1: ➏
            edge = self.edge_list[edge_idx] ➐
            if ds.collapsing_find(edge.u) != ds.collapsing_find(edge.v): ➑
                mst.add_edge(edge.u, edge.v, edge.w) ➒
                ds.weighted_union(ds.collapsing_find(edge.u),
                                  ds.collapsing_find(edge.v))➓
                mst_edge_num += 1
            edge_idx += 1

        return mst

➊ 최종적으로 만들 MST

➋ 분리 집합: 사이클 형성 검사를 할 정점 집합

➌ 가중치에 따라 에지 정렬

➍ mst에 속하는 에지 개수

➎ 정렬된 에지 리스트에서 인덱스

➏ |TE| = |TV|-1이면 종료

➐ 가중치가 작은 순서대로 에지를 가져옵니다.

➑ FIND(u)! = FIND(v)면 사이클을 형성하지 않습니다.

➒ TE = TE U {(u, v)}

➓ UNION(u, v)