def kruskal(G) -> "list(namedetuple)": res = [] u = UnionFind() # initialise union-find DS for edge in iter(sorted(G.edges, key=lambda x: x.weight)): # go through all the edges and feed the nodes to the union method # if their roots are not same if u.isConnected(edge.node1, edge.node2): continue u.union(edge.node1, edge.node2) res.append(edge) return res
class KruskalMST: def __init__(self, graph): self.__G = graph n = self.__G.V() self.__uf = UnionFind(self.__G.E() + n) self.__data = [] self.__mst = [] self.__pq = MiniHeap("weight") self.createMiniHeap(self.__pq) self.__mstWeight = 0 while (self.__pq.isEmpty() == False and len(self.__mst) < n): edge = self.__pq.extractMin() if (self.__uf.isConnected(edge.v(), edge.w())): continue else: #print "insert ,minedge===",edge.v(),edge.w(),edge.weight() self.__mst.append(edge) self.__uf.unionElements(edge.v(), edge.w()) for i in range(len(self.__mst)): self.__mstWeight += self.__mst[i].weight() def createMiniHeap(self, pq): n = self.__G.V() for i in range(n): adj = self.__G.adjIterator(self.__G, i) edge = adj.begin() while adj.end() == False: if edge.v() < edge.w(): pq.insert(edge) edge = adj.next() def mstEdges(self): return self.__mst def result(self): return self.__mstWeight