Ejemplo n.º 1
0
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