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学习资料
Feb 08 Python
python的numpy模块安装不成功简单解决方法总结
Dec 23 Python
Django保护敏感信息的方法示例
May 09 Python
Python中@property的理解和使用示例
Jun 11 Python
python多进程间通信代码实例
Sep 30 Python
python sorted方法和列表使用解析
Nov 18 Python
Keras: model实现固定部分layer,训练部分layer操作
Jun 28 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
Jun 30 Python
python实现简单贪吃蛇游戏
Sep 29 Python
Python 使用office365邮箱的示例
Oct 29 Python
python3中数组逆序输出方法
Dec 01 Python
基于 Python 实践感知器分类算法
Jan 07 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 SEO优化之URL优化方法
2011/04/21 PHP
PHP中英混合字符串截取函数代码
2011/07/17 PHP
Zend Framework教程之Zend_Registry对象用法分析
2016/03/22 PHP
PHP 极验验证码实例讲解
2016/09/29 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
详细分析PHP 命名空间(namespace)
2020/06/30 PHP
弹出广告特效(一个IP只弹出一次)的代码
2007/07/27 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
微信小程序小组件 基于Canvas实现直播点赞气泡效果
2020/05/29 Javascript
angular 用拦截器统一处理http请求和响应的方法
2017/06/08 Javascript
JavaScript中一些特殊的字符运算
2017/08/17 Javascript
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
详解Vue.js iview实现树形权限表(可扩展表)
2018/09/30 Javascript
基于Angular中ng-controller父子级嵌套的相关属性详解
2018/10/08 Javascript
微信小程序tabbar底部导航
2018/11/05 Javascript
浅析Vue.js 中的条件渲染指令
2018/11/19 Javascript
利用d3.js实现蜂巢图表带动画效果
2019/09/03 Javascript
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
php使用递归与迭代实现快速排序示例
2014/01/23 Python
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
matplotlib绘图实例演示标记路径
2018/01/23 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
2019/06/19 Python
深入了解Django中间件及其方法
2019/07/26 Python
Python socket非阻塞模块应用示例
2019/09/12 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
李维斯德国官方网上商店:Levi’s德国
2016/09/10 全球购物
Foreo国际站:Foreo International
2018/10/29 全球购物
业务员岗位职责
2013/11/16 职场文书
房屋出租委托书格式
2014/09/23 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
检讨书范文大全
2015/05/07 职场文书
反四风问题学习心得体会
2016/01/22 职场文书
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python