def mst_prim(self, r=0):
        """Returns the set of edges in some
        minimum spanning tree (MST) of the graph,
        computed using Prim's algorithm.

        Keyword arguments:
        r - vertex id to designate as the root (default is 0).
        """

        parent = [None for x in range(len(self._adj))]
        Q = PQ()
        Q.add(r, 0)
        for u in range(len(self._adj)):
            if u != r:
                Q.add(u, math.inf)
        while not Q.is_empty():
            u = Q.extract_min()
            for v, w in self._adj[u].__iter__(True):
                if Q.contains(v) and w < Q.get_priority(v):
                    parent[v] = u
                    Q.change_priority(v, w)
        A = set()
        for v, u in enumerate(parent):
            if u != None:
                A.add((u, v))
                # A = A | {(u,v)}
        return A
예제 #2
0
 def MST_Prim(self, r=0) :
     parent = [ None for x in range(self.numVertices())]
     Q = PQ()
     Q.add(r,0)
     for u in range(self.numVertices()) :
         if u!=r :
             Q.add(u,inf)
     while not Q.isEmpty() :
         u = Q.extractMin()
         for v in self._adj[u] :
             if Q.contains(v) and self._w[(u,v)] < Q.getPriorityValue(v) :
                 parent[v] = u
                 Q.changePriorityValue(v, self._w[(u,v)])
     A = set()
     for u, v in enumerate(parent) :
         if v!=None:
             A.add((u,v))
     return A