예제 #1
0
    def dijkstra(self,s):
        """Dijkstra's Algorithm using a binary heap as the PQ.

        Keyword Arguments:
        s - The source vertex.
        """

        # Programming Assignment 3:
        # 2) Implement Dijkstra's Algorithm using a binary heap implementation of a PQ as the PQ.
        
        pointers = [None for i in range(len(self._adj))]
        costs = [math.inf for i in range(len(self._adj))]
        pointers[s]=s
        costs[s]=0

        S = set()
        Q = PQ()
        
        #Q = G.V
        for i in range(len(self._adj)):
            Q.add(i,costs[i])

        while(not Q.is_empty()):
            u = Q.extract_min()
            S = S | {u}
            for v in self._adj[u].__iter__(True):
                #relax
                if v[1]+costs[u] < costs[v[0]]:
                    costs[v[0]] = v[1]+costs[u]
                    pointers[v[0]]=u
                    Q.change_priority(v[0],costs[v[0]])

        return [(i,costs[i],pointers[i]) for i in range(len(self._adj))]
    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
예제 #3
0
 def DijkstrasVersion2(self,s) :
     S = PQ()
     TL = []
     class VertexData :
         pass
     vertices = [VertexData() for i in range(len(self._adj))]
     for i in range(len(vertices)) :
         vertices[i].d = inf
         vertices[i].pred = -1
         S.add(i, vertices[i].d)
     vertices[s].d = 0
     vertices[s].pred = -1
     while not S.is_empty() :
         u = S.extract_min()
         
         TL.append((u, vertices[u].d, vertices[u].pred))
         for i in self._adj[u]:
             distance = vertices[u].d + self._w[(u,i)]
             if(distance < vertices[i].d):
                 vertices[i].d = distance
                 vertices[i].pred = u
                 S.change_priority(i, distance)
     return TL
예제 #4
0
 def DijkstrasVersion2(self,s) :
     class VertexData:
         pass
     vList = [VertexData() for i in range(len(self._adj))]
     S = list()
     Q = PQ()
     vList[s].dist = 0
     vList[s].prev = None
     for v in range(len(vList)):
         if(v != s):
             vList[v].dist = float('inf')
             vList[v].prev = None
         Q.add(v, vList[v].dist)
     while not Q.is_empty():
         u = Q.extract_min()
         S.append((u, vList[u].dist, vList[u].prev))
         for v in self._adj[u]:
             temp = vList[u].dist + self._w[(u,v)]
             if temp < vList[v].dist:
                 vList[v].dist = temp
                 vList[v].prev = u
                 Q.change_priority(v, temp)
     return S