python 图 狄克斯特拉算法

说明

迪克斯特拉算法,就是在图中,将某一点到达图中任意顶点的权值改变,变成最小的

完整代码

# coding=utf8

a, b, c, d, e, f = range(6)

G = {
    a: {b: 2, c: 1, d: 4, f: 10},  # a
    b: {a: 2, c: 4, e: 3},         # b
    c: {a: 1, b: 4, d: 2, f: 8},   # c
    d: {a: 4, c: 2, e: 1},         # d
    e: {b: 3, d: 1, f: 7},         # e
    f: {a: 10, c: 8, e: 7},        # f
}

import heapq
def djksttra(G, s):
    # 迪克斯特拉
    # python中利用float('inf')来刻画一个无穷大的数
    inf = float('inf')
    # 将每一个点的距设置为无穷大
    D = {v: inf for v in G}
    # 起始顶点到某一个顶点的距离
    D[s] = 0
    # 存放当前访问节点的父节点
    P = {}
    # 访问过的顶点放进一个结合,避免无限循环
    S = {s}
    # 当前访问的顶点
    v = s
    # 有先级队列
    q = []
    # 循环总共的顶点数的次数
    for _ in range(len(G) - 1):
        for u, w in G[v].iteritems():
            # 计算从当前顶点到邻接顶点的距离
            d = D[v] + G[u][v]
            # 如果当前的距离大于从邻接顶点的距离则更新
            if D[u] > d:
                # 距离更新
                D[u] = d
                # 父顶点更新
                P[u] = v
                # 把当前的距离,子顶点添加到优先级队列
                heapq.heappush(q, (w, u))
        while q:
            # 从优先级队列里弹出一个距离最小的子顶点
            _, v = heapq.heappop(q)
            if v not in S:
                # 只有不在访问过的集合中,才能被访问
                S.add(v)
                break
        else:
            break
    return D, P

D, P = djksttra(G, a)
print D, P

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值