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
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