def dijkstra(aGraph, start):
    pq = PriorityQueue()
    start.setDistance(0)
    pq.buildHeap([(v.getDistance(), v) for v in aGraph])

    while not pq.isEmpty():
        currentVert = pq.delMin()

        for nextVert in currentVert.getConnections():
            newDist = currentVert.getDistance() \
                    + currentVert.getWeight(nextVert)

            if newDist < nextVert.getDistance():
                nextVert.setDistance(newDist)
                nextVert.setPred(currentVert)
                pq.decreaseKey(nextVert, newDist)
Exemple #2
0
def dijkstra(G, start):
    '''最短路径算法,时间复杂度:O((V+E)logV)
       需要整个图,实际运用不现实
       距离矢量路由算法只需要一部分图顶点'''
    start = G.getVertex(start)
    start.setDistance(0)
    PriQueue = PriorityQueue()  #加入队列
    PriQueue.buildHeap([(v.getDistance(), v) for v in G])

    while not PriQueue.isEmpty():
        currVert = PriQueue.delMin()
        for nbr in currVert.getConnections():
            newDist = currVert.getDistance() + currVert.getWeight(nbr)
            if newDist < nbr.getDistance():
                nbr.setPred(currVert)
                nbr.setDistance(newDist)
                PriQueue.decreaseKey(nbr, newDist)
Exemple #3
0
def prim(G, start):
    '''贪婪算法系列算法,时间复杂度:O((V+E)logV + V)'''
    for v in G:
        v.setDistance(sys.maxsize)
        v.setPred(None)

    start = G.getVertex(start)
    start.setDistance(0)
    PriQueue = PriorityQueue()  #创建优先队列
    PriQueue.buildHeap([(v.getDistance(), v) for v in G])

    while not PriQueue.isEmpty():
        currVert = PriQueue.delMin()
        for nbr in currVert.getConnections():
            newDist = currVert.getDistance() + currVert.getWeight(nbr)
            if nbr in PriQueue and newDist < nbr.getDistance():
                nbr.setPred(currVert)
                nbr.setDistance(newDist)
                PriQueue.decreaseKey(nbr, newDist)