コード例 #1
0
    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)
コード例 #2
0
        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)
'''
コード例 #3
0
                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算法很相似
'''