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)
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)
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)