pq.buildHeap([(v.getDistance(), v) for v in G]) while not pq.isEmpty(): closest = pq.delMin() for n in closest.getConnections(): newCost = closest.getWeight(n) if n in pq and newCost < n.getDistance(): n.setPred(closest) n.setDistance(newCost) pq.decreaseKey(n, newCost) return G g = Graph() g.addVertex(0) g.addVertex(1) g.addVertex(2) g.addVertex(3) g.addEdge(0, 1, 10) g.addEdge(1, 0, 10) g.addEdge(0, 2, 6) g.addEdge(2, 0, 6) g.addEdge(0, 3, 5) g.addEdge(3, 0, 5) g.addEdge(1, 3, 15) g.addEdge(3, 1, 15) g.addEdge(2, 3, 4) g.addEdge(3, 2, 4)
self.vertList[f].addNeighbor(self.vertList[t], cost) def getVertices(self): return self.vertList.keys() def __contains__(self, key): return key in self.vertList def __iter__(self): return iter(self.vertList.values()) #测试 g = Graph() for i in range(4): g.addVertex(i) g.addEdge(0, 1, 5) g.addEdge(0, 2, 4) g.addEdge(1, 2, 3) g.addEdge(1, 3, 3) g.addEdge(2, 4, 1) g.addEdge(2, 5, 2) # for v in g: # print(v) # print(g.getVertex(1)) ''' 2.图的遍历(非强连通图也可以) 2.1 BFS 时间复杂度:O(V+E) '''
nextV.setDistance(newDist) nextV.setPred(curV) pq.decreaseKey(nextV,newDist) #这个方法应该是内部调用了percUp(),有调整堆的味道 #初始化图 v = ['u','v','x','w','y','z'] #无向图一定要这样创建吗? edge = [('u','v',2),('u','w',5),('u','x',1), ('v','u',2),('v','x',2),('v','w',3), ('x','u',1),('x','v',2),('x','w',3),('x','y',1), ('w','v',2),('w','u',5),('w','x',3),('w','y',1),('w','z',5), ('y','x',1),('y','w',1),('y','z',1), ('z','w',5),('z','y',1)] g = Graph() g.addVertex(v for v in v) for cur,nbr,weight in edge: g.addEdge(cur, nbr, weight) # print(g.getVertex('w')) # #测试 # dijkstra(g,g.getVertex('u')) # for v in v[1:]: # print('u到%s的最短距离:%i' % (v,g.getVertex(v).getDistance())) ''' 4.最小生成树 注:同Dijkstra算法很相似 '''