コード例 #1
0
 def dijkstra(self, start_label, end_label):
     start_vertex = self.find_vertex_by_label(start_label)
     start_vertex.weight = 0
     pq = PriorityQueue()
     pq.build_heap(self.vertices)
     while not pq.isEmpty():
         min_vertex = pq.getMin()  # return Vertex object
         for neighbour_vertex in self.adjacencyList[min_vertex.label]:
             tmp_vertex = self.find_vertex_by_label(
                 neighbour_vertex.label)  # vertex object from self.vertices
             if min_vertex.weight + neighbour_vertex.weight < tmp_vertex.weight:
                 tmp_vertex.parent = min_vertex.label
                 tmp_vertex.weight = min_vertex.weight + neighbour_vertex.weight
         pq.deleteMin()
     print(self.print_path(end_label))
コード例 #2
0
ファイル: PSTA.py プロジェクト: Napchat/Algorithms
def prim(G, start):
    pq = PriorityQueue()
    for v in G:
        v.setDistance(sys.maxsize)
        v.setPred(None)
    start.setDisatance(0)
    pq.build_heap([(v.getDistance(), v) for v in G])
    while not pq.is_empty():
        currentVert = pq.del_min()
        for nextVert in currentVert.getConnections():
            newCost = currentVert.getWeight(nextVert)
            if nextVert in pq and newCost < nextVert.getDistance():
                nextVert.setPred(currentVert)
                nextVert.setDisatance(newCost)
                pq.decrease_key(nextVert, newCost)
 def prim(self, start_label):
     start_vertex = self.find_vertex_by_label(start_label)
     start_vertex.weight = 0
     pq = PriorityQueue()
     #for vertex in self.vertices:
     #    pq.insert(vertex)
     pq.build_heap(self.vertices)
     while not pq.isEmpty():
         min_vertex = pq.getMin()  # return Vertex object
         if min_vertex.parent is not None:
             self.path += (min_vertex.parent + " -> " + min_vertex.label +
                           ", ")
         for neighbour_vertex in self.adjacencyList[min_vertex.label]:
             tmp_vertex = self.find_vertex_by_label(
                 neighbour_vertex.label)  # vertex object from self.vertices
             if neighbour_vertex.weight < tmp_vertex.weight:
                 tmp_vertex.parent = min_vertex.label
                 tmp_vertex.weight = neighbour_vertex.weight
         pq.deleteMin()
     print(self.path)
コード例 #4
0
def dijkstra(aGraph, start):

    # Actually, it is a priority queue.
    pq = PriorityQueue()

    start.setDistance(0)

    # :meth:`biuld_heap` is O(logV)
    pq.build_heap([(v.getDistance(), v) for v in aGraph])
    while not pq.is_empty():

        # :meth:`del_min()` is O(logV), within the `while` loop, it is O(Vlog(V))
        currentVert = pq.del_min()

        # The `for` loop is O(E)
        for nextVert in currentVert.getConnections():
            newDist = currentVert.getDistance() + currentVert.getWeight(
                nextVert)
            if newDist < nextVert.getDistance():
                nextVert.setDistance(newDist)
                nextVert.setPred(currentVert)

                # :meth:`decrease_key` is within `for` loop, it is O(Elog(V))
                pq.decrease_key(nextVert, newDist)