最短路径算法之Dijkstra算法

172 篇文章 4 订阅
148 篇文章 3 订阅
# Dijkstra算法——通过边实现松弛
# 指定一个点到其他各顶点的路径——单源最短路径

# 每次找到离源点最近的一个顶点,然后以该顶点为重心进行扩展
# 最终的到源点到其余所有点的最短路径
# 一种贪婪算法

def Dijkstra(G, v0, INF = float('inf')):
    """ 使用 Dijkstra 算法计算指定点 v0 到图 G 中任意点的最短路径的距离
        INF 为设定的无限远距离值
        此方法不能解决负权值边的图
    """
    book = set()
    minv = v0

    # 源顶点到其余各顶点的初始路程
    dis = dict((k, INF) for k in G.keys())
    dis[v0] = 0

    while len(book) < len(G):
        book.add(minv)  # 确定当期顶点的距离
        for w in G[minv]:  # 以当前点的中心向外扩散
            if dis[minv] + G[minv][w] < dis[w]:  # 如果从当前点扩展到某一点的距离小与已知最短距离
                dis[w] = dis[minv] + G[minv][w]  # 对已知距离进行更新

        new = INF  # 从剩下的未确定点中选择最小距离点作为新的扩散点
        for v in dis.keys():
            if v in book: continue
            if dis[v] < new:
                new = dis[v]
                minv = v
    return dis

if __name__ == '__main__':
    # 初始化图参数
    G = {1: {1: 0, 2: 2, 4: 1, 6: 3},
         2: {2: 0, 3: 6, 5: 5},
         3: {3: 0, 8: 6},
         4: {2: 10, 4: 0, 7: 2},
         5: {5: 0, 3: 9, 8: 4},
         6: {6: 0, 4: 5, 7: 4},
         7: {2: 7, 5: 3, 8: 8, 7: 0},
         8: {8: 0}}

    start = 1
    dis = Dijkstra(G, v0 = start)
    print(dis)
参考:
  1. 最短路径算法之Dijkstra算法
  2. 漫画:图的 “最短路径” 问题
  3. python如何实现Dijkstra算法–最短路径问题
  4. Github代码
  5. 算法数据结构 | 10行实现最短路算法——Dijkstra
  6. 最短路径 (优秀博客!!!)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值