예제 #1
0
파일: kruskal.py 프로젝트: junehan-dev/CS
    def MST_kruskal(self):
        #최종적으로 만들어질 MST
        mst = Graph()
        mst.add_vertex(self.vertex_num)
        #분리집합 : 사이클 형성 검사를 할 정점 집합
        ds = DisjointSet(self.vertex_num)
        #가중치에 따라 에지를 정렬
        self.edge_list.sort(key=lambda e: e.weight)
        #mst에 속하는 에지의 수
        mst_edge_num = 0
        #정렬된 에지 리스트에서 인덱스
        edge_idx = 0
        #|TE| = |TV|-1이면 종료
        while mst_edge_num < self.vertex_num - 1:
            #가중치가 작은 순서대로 에지를 가져온다
            edge = self.edge_list[edge_idx]
            #FIND(u) != FIND(v)이면 사이클을 형성하지 않는다
            if ds.collapsing_find(edge.v1) != ds.collapsing_find(edge.v2):
                #TE=TE U {(u, v)}
                mst.insert_edge(edge.v1, edge.v2, edge.weight)
                #UNION(u, v)
                ds.weighted_union(ds.collapsing_find(edge.v1),
                                  ds.collapsing_find(edge.v2))
                mst_edge_num += 1
            edge_idx += 1

        return mst
예제 #2
0
    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.insert_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