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 23 Python
python实现线程池的方法
Jun 30 Python
django1.8使用表单上传文件的实现方法
Nov 04 Python
Python利用正则表达式实现计算器算法思路解析
Apr 25 Python
python 基本数据类型占用内存空间大小的实例
Jun 12 Python
基于windows下pip安装python模块时报错总结
Jun 12 Python
浅谈pyqt5在QMainWindow中布局的问题
Jun 21 Python
Django logging配置及使用详解
Jul 23 Python
Mac 使用python3的matplot画图不显示的解决
Nov 23 Python
基于pandas中expand的作用详解
Dec 17 Python
使用 Python 处理3万多条数据只要几秒钟
Jan 19 Python
python 获取域名到期时间的方法步骤
Feb 10 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中jQuery插件autocomplate的简单使用笔记
2012/06/14 PHP
php基础教程 php内置函数实例教程
2012/08/21 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
2015/06/06 PHP
PHP微信API接口类
2016/08/22 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
新页面打开实际尺寸的图片
2006/08/25 Javascript
js传值 判断
2006/10/26 Javascript
Javascript图像处理—平滑处理实现原理
2012/12/28 Javascript
纯javascript判断查询日期是否为有效日期
2015/08/24 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
node.js require() 源码解读
2015/12/13 Javascript
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
禁止弹窗中蒙层底部页面跟随滚动的几种方法
2017/12/07 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
vue router 配置路由的方法
2018/07/26 Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
2019/10/16 Javascript
vue解决跨域问题(推荐)
2020/11/10 Javascript
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
python 快速排序代码
2009/11/23 Python
详解python基础之while循环及if判断
2017/08/24 Python
Python进阶之@property动态属性的实现
2019/04/01 Python
pytorch实现mnist分类的示例讲解
2020/01/10 Python
基于python实现简单网页服务器代码实例
2020/09/14 Python
用CSS3来实现社交分享按钮
2014/11/11 HTML / CSS
webView加载html图片遇到的问题解决
2019/10/08 HTML / CSS
Roots加拿大官网:加拿大休闲服饰品牌
2016/10/24 全球购物
美国办公用品折扣网站:Shoplet.com
2019/11/24 全球购物
linux面试题参考答案(7)
2012/10/29 面试题
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
财经学院自荐信范文
2014/02/02 职场文书
毕业生自荐信格式
2014/03/07 职场文书
无锡灵山大佛导游词
2015/02/09 职场文书
表彰大会新闻稿
2015/07/17 职场文书