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 正则表达式(转义问题)
Dec 15 Python
python基础教程之匿名函数lambda
Jan 17 Python
flask使用session保存登录状态及拦截未登录请求代码
Jan 19 Python
PyCharm配置mongo插件的方法
Nov 30 Python
python使用wxpy实现微信消息防撤回脚本
Apr 29 Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 Python
PyQt5使用QTimer实现电子时钟
Jul 29 Python
Python Web框架之Django框架cookie和session用法分析
Aug 16 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
Dec 09 Python
python tkinter GUI绘制,以及点击更新显示图片代码
Mar 14 Python
pytorch 实现L2和L1正则化regularization的操作
Mar 03 Python
python 批量压缩图片的脚本
Jun 02 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的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
php绘图中显示不出图片的原因及解决
2014/03/05 PHP
js原型链原理看图说明
2012/07/07 Javascript
Js控制弹窗实现在任意分辨率下居中显示
2013/08/01 Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
2014/10/19 Javascript
纯js实现无限空间大小的本地存储
2015/06/18 Javascript
简述Jquery与DOM对象
2015/07/10 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
jquery密码强度校验
2015/12/02 Javascript
jQuery实现的模拟弹出窗口功能示例
2016/11/24 Javascript
js document.getElementsByClassName的使用介绍与自定义函数
2016/11/25 Javascript
jQuery导航条固定定位效果实例代码
2017/05/26 jQuery
JS实现图片旋转动画效果封装与使用示例
2018/07/09 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
javascript 数组精简技巧小结
2020/02/26 Javascript
深入探究Django中的Session与Cookie
2017/07/30 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
2017/09/08 Python
Python 打印中文字符的三种方法
2018/08/14 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
Python定义一个函数的方法
2020/06/15 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
Python模块常用四种安装方式
2020/10/20 Python
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
海外淘书首选:AbeBooks
2017/07/31 全球购物
T3官网:头发造型工具
2019/12/26 全球购物
纯净、自信、100%的羊绒服装:360Cashmere
2021/02/20 全球购物
销售内勤岗位职责
2014/04/15 职场文书
战略合作协议书范本
2014/04/18 职场文书
质量整改通知单
2015/04/21 职场文书
老人院义工活动感想
2015/08/07 职场文书
先进基层党组织事迹材料2016
2016/02/29 职场文书
MySQL不使用order by实现排名的三种思路总结
2021/06/02 MySQL
python如何利用cv2.rectangle()绘制矩形框
2022/12/24 Python