class KruskalsMST: def __init__(self, g): self.mst = [] self.g = g self.heap = MinHeap() self.UF = UnionFind(g.V) self.populateHeap() self.populate_mst() def populateHeap(self): edges = set() for i in range(self.g.V): for edge in self.g.adj(i): edges.add(edge) for edge in edges: self.heap.add_item(edge) def populate_mst(self): while len(self.mst) < self.g.V - 1 and not self.heap.is_empty(): edge = self.heap.del_min() if not self.UF.find(edge.either(), edge.other(edge.either())): self.mst.append(edge) self.UF.union(edge.either(), edge.other(edge.either())) def get_mst(self): return self.mst
class KruskalsMST: def __init__(self, g): self.mst = [] self.g = g self.heap = MinHeap() self.done = [False]*self.g.V self.populate_mst() def travel_node(self, node): self.done[node] = True for each in self.g.adj(node): self.heap.add_item(each) def populate_mst(self): self.travel_node(0) while len(self.mst) < self.g.V-1 and not self.heap.is_empty(): edge = self.heap.del_min() if not self.done[edge.either()] and self.done[edge.other(edge.either())]: self.travel_node(edge.either()) self.mst.append(edge) elif self.done[edge.either()] and not self.done[edge.other(edge.either())]: self.travel_node(edge.other(edge.either())) self.mst.append(edge) def get_mst(self): return self.mst