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 相关文章推荐
Python3里的super()和__class__使用介绍
Apr 23 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
Sep 11 Python
Python实现矩阵转置的方法分析
Nov 24 Python
Python基于生成器迭代实现的八皇后问题示例
May 23 Python
CentOS 7 安装python3.7.1的方法及注意事项
Nov 01 Python
python__name__原理及用法详解
Nov 02 Python
浅谈Django2.0 加xadmin踩的坑
Nov 15 Python
Python Selenium 设置元素等待的三种方式
Mar 18 Python
Python 打印自己设计的字体的实例讲解
Jan 04 Python
如何获取numpy array前N个最大值
May 14 Python
Python 实现Mac 屏幕截图详解
Oct 05 Python
Python+OpenCV实现在图像上绘制矩形
Mar 21 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
PHILIPS L4X25T电路分析和打理
2021/03/02 无线电
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
Aster vs KG BO3 第二场2.18
2021/03/10 DOTA
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
2013/06/09 Javascript
js 与 php 通过json数据进行通讯示例
2014/03/26 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
[原创]Javascript 实现广告后加载 可加载百度谷歌联盟广告
2016/05/11 Javascript
jq stop()和:is(:animated)的用法及区别(详解)
2017/02/12 Javascript
JavaScript中常见的八个陷阱总结
2017/06/28 Javascript
node.js操作MongoDB的实例详解
2017/10/11 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题
2020/07/28 Javascript
python实现人人网登录示例分享
2014/01/19 Python
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
Python实现高效求解素数代码实例
2015/06/30 Python
Flask框架学习笔记之模板操作实例详解
2019/08/15 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
2019/11/04 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
HTML5中Canvas与SVG的画图原理比较
2013/01/16 HTML / CSS
html5使用canvas绘制文字特效
2014/12/15 HTML / CSS
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
大学生表扬信范文
2014/01/09 职场文书
《海伦?凯勒》教学反思
2014/04/17 职场文书
党员廉洁自律承诺书
2014/05/26 职场文书
正科级干部考察材料
2014/05/29 职场文书
工作态度不端正检讨书
2014/10/04 职场文书
房产公证书格式
2015/01/26 职场文书
2015年测量员工作总结
2015/05/23 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL