Python实现迪杰斯特拉算法过程解析


Posted in Python onSeptember 18, 2020

一、 迪杰斯特拉算法思想

Dijkstra算法主要针对的是有向图的单元最短路径问题,且不能出现权值为负的情况!Dijkstra算法类似于贪心算法,其应用根本在于最短路径的最优子结构性质。

最短路径的最优子结构性质:

如果P(i,j)={Vi…Vk…Vs…Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。

证明:

假设P(i,j)={Vi…Vk…Vs…Vj}是从顶点i到j的最短路径,则有P(i,j)=P(i,k)+P(k,s)+P(s,j)。而P(k,s)不是从k到s的最短距离,那么必定存在另一条从k到s的最短路径P(k,s),那么P(i,j)=P(i,k)+P(k,s)+P(s,j)<P(i,j)。则与P(i,j)是从i到j的最短路径相矛盾。因此该性质得证。

因此,Dijkstra算法描述如下:

Dijikstra算法描述如下:

假设存在G=<V,E>,源顶点为V0,S={V0},distance[i]记录V0到i的最短距离,matrix[i][j]记录从i到j的边的权值,即两点之间的距离。

1)从V-S中选择使dist[i]值最小的顶点i,将i加入到U中;

2)更新与i直接相邻顶点的dist值。dist[j]=min{dist[j],dist[i]+matrix[i][j]}

3)直到S=V,所有顶点都包含进来了,算法停止。

二、 具体操作步骤

根据其算法思想,确立操作步骤如下:

(1) 初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为"起点s到该顶点的距离"[例如,U中顶点v的距离为(s,v)的长度,然后s和v不相邻,则v的距离为∞]。

(2) 从U中选出"距离最短的顶点k",并将顶点k加入到S中;同时,从U中移除顶点k。

(3) 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。

(4) 重复步骤(2)和(3),直到遍历完所有顶点。

三、代码

def dijkstra(s, used, cost, distance, n):
  distance[s] = 0
  while True:
    # v在这里相当于是一个哨兵,对包含起点s做统一处理!
    v = -1
    # 从未使用过的顶点中选择一个距离最小的顶点
    for u in range(n):
      if not used[u] and (v == -1 or distance[u] < distance[v]):
        v = u
    if v == -1:
      # 说明所有顶点都维护到S中了!
      break

    # 将选定的顶点加入到S中, 同时进行距离更新
    used[v] = True
    # 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。
    for u in range(n):
      distance[u] = min(distance[u], distance[v] + cost[v][u])

  return distance


n, m, T = map(int, input().split())

# 标记数组:used[v]值为False说明改顶点还没有访问过,在S中,否则在U中!
used = [False for _ in range(n)]
# 距离数组:distance[i]表示从源点s到i的最短距离,distance[s]=0
distance = [float('inf') for _ in range(n)]
# cost[u][v]表示边e=(u,v)的权值,不存在时设为INF
cost = [[float('inf') for _ in range(n)] for _ in range(n)]

for _ in range(m):
  e = list(map(int, input().split()))
  cost[e[0] - 1][e[1] - 1] = e[2]

dis1 = dijkstra(0, used[:], cost, distance[:], n)
d1 = dis1[-1]
dis2 = dijkstra(n-1, used[:], cost, distance[:], n)
d2 = dis2[0]

print((d1+d2)*T)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python远程登录代码
Apr 29 Python
python实现合并两个数组的方法
May 16 Python
python关键字and和or用法实例
May 28 Python
Python+Pandas 获取数据库并加入DataFrame的实例
Jul 25 Python
python特性语法之遍历、公共方法、引用
Aug 08 Python
Python 日期的转换及计算的具体使用详解
Jan 16 Python
python中图像通道分离与合并实例
Jan 17 Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 Python
Python进程Multiprocessing模块原理解析
Feb 28 Python
django有哪些好处和优点
Sep 01 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
Sep 03 Python
python 第三方库paramiko的常用方式
Feb 20 Python
Python 操作 MySQL数据库
Sep 18 #Python
python实现人工蜂群算法
Sep 18 #Python
Python猫眼电影最近上映的电影票房信息
Sep 18 #Python
python实现简单遗传算法
Sep 18 #Python
详解python 支持向量机(SVM)算法
Sep 18 #Python
python利用线程实现多任务
Sep 18 #Python
Pycharm的Available Packages为空的解决方法
Sep 18 #Python
You might like
PHP CKEditor 上传图片实现代码
2009/11/06 PHP
php实现短信发送代码
2015/07/05 PHP
PHP模板引擎Smarty内建函数详解
2016/04/11 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
window.open()弹出居中的窗口
2007/02/01 Javascript
js的闭包的一个示例说明
2008/11/18 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
用javascript替换URL中的参数值示例代码
2014/01/27 Javascript
用jquery模仿的a的title属性的例子
2014/10/22 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
2014/12/29 Javascript
javascript实现五星评分功能
2015/11/10 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
JavaScript实现阿拉伯数字和中文数字互相转换
2016/06/12 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
2017/10/08 Javascript
详解webpack3编译兼容IE8的正确姿势
2017/12/21 Javascript
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
JavaScript交换两个变量方法实例
2019/11/25 Javascript
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
python中string模块各属性以及函数的用法介绍
2016/05/30 Python
高质量Python代码编写的5个优化技巧
2017/11/16 Python
pandas的object对象转时间对象的方法
2018/04/11 Python
解决Pandas的DataFrame输出截断和省略的问题
2019/02/08 Python
PyQtGraph在pyqt中的应用及安装过程
2019/08/04 Python
python多进程(加入进程池)操作常见案例
2019/10/21 Python
python实现电子词典
2020/03/03 Python
使用Pytorch搭建模型的步骤
2020/11/16 Python
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
李宁官方网店:中国运动品牌
2017/11/02 全球购物
高校毕业生登记表自我鉴定
2013/11/03 职场文书
计算机专业推荐信范文
2013/11/20 职场文书
优秀技术工人先进材料
2014/02/17 职场文书
建设单位项目负责人任命书
2014/06/06 职场文书
2014最新实习证明模板
2014/10/02 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书