Esempio n. 1
0
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
Esempio n. 2
0
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