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标准库之多进程(multiprocessing包)介绍
Nov 25 Python
浅谈flask中的before_request与after_request
Jan 20 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
May 24 Python
对Python 数组的切片操作详解
Jul 02 Python
python实现C4.5决策树算法
Aug 29 Python
Pandas GroupBy对象 索引与迭代方法
Nov 16 Python
django富文本编辑器的实现示例
Apr 10 Python
解决Django中多条件查询的问题
Jul 18 Python
详解Python3定时器任务代码
Sep 23 Python
python实现实时视频流播放代码实例
Jan 11 Python
Python参数传递机制传值和传引用原理详解
May 22 Python
Python控制台输出俄罗斯方块移动和旋转功能
Apr 18 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 静态化实现代码
2009/03/20 PHP
PHP Error与Logging函数的深入理解
2013/06/03 PHP
PHP设计模式之单例模式原理与实现方法分析
2018/04/25 PHP
php实现session共享的实例方法
2019/09/19 PHP
jQuery图片播放8款精美插件分享
2013/02/17 Javascript
基于NodeJS的前后端分离的思考与实践(五)多终端适配
2014/09/26 NodeJs
用JavaScript实现对话框的教程
2015/06/04 Javascript
js去字符串前后空格的实现方法
2016/02/26 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
javascript 中的事件委托详解
2016/10/25 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
详解Vue.use自定义自己的全局组件
2017/06/14 Javascript
vue绑定class与行间样式style详解
2017/08/16 Javascript
详解vue-cli项目中用json-sever搭建mock服务器
2017/11/02 Javascript
详解vue-cli之webpack3构建全面提速优化
2017/12/25 Javascript
node+koa2+mysql+bootstrap搭建一个前端论坛
2018/05/06 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
了解JavaScript函数中的默认参数
2019/05/30 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
JavaScript事件委托实现原理及优点进行
2020/08/29 Javascript
Python基本语法经典教程
2016/03/11 Python
Python处理Excel文件实例代码
2017/06/20 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
2018/06/04 Python
Python爬虫使用脚本登录Github并查看信息
2018/07/16 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
tensorflow2.0的函数签名与图结构(推荐)
2020/04/28 Python
简述python&amp;pytorch 随机种子的实现
2020/10/07 Python
基于注解实现 SpringBoot 接口防刷的方法
2021/03/02 Python
世界著名的顶级牛排:Omaha Steak(奥马哈牛排)
2016/09/20 全球购物
马来西亚在线购物:POPLOOK.com
2019/12/09 全球购物
PHP如何调用MYSQL存储过程
2014/05/30 面试题
十八届三中全会报告学习材料
2014/02/17 职场文书
出纳员的岗位职责
2014/02/22 职场文书
天堂的孩子观后感
2015/06/11 职场文书
小学作文指导之如何写人?
2019/07/08 职场文书
提升Nginx性能的一些建议
2021/03/31 Servers