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的Supervisor进行进程监控以及自动启动
May 29 Python
Python语言实现机器学习的K-近邻算法
Jun 11 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
Feb 18 Python
基于python元祖与字典与集合的粗浅认识
Aug 23 Python
Python反射的用法实例分析
Feb 11 Python
Python如何爬取实时变化的WebSocket数据的方法
Mar 09 Python
python按修改时间顺序排列文件的实例代码
Jul 25 Python
python安装本地whl的实例步骤
Oct 12 Python
python自动识别文本编码格式代码
Dec 26 Python
Python查找不限层级Json数据中某个key或者value的路径方式
Feb 27 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
May 11 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
Dec 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
yii操作session实例简介
2014/07/31 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
2012/05/16 Javascript
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
跟我学Node.js(四)---Node.js的模块载入方式与机制
2014/06/04 Javascript
重写document.write实现无阻塞加载js广告(补充)
2014/12/12 Javascript
JavaScript面向对象程序设计教程
2016/03/29 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
node.js express中app.param的用法详解
2017/07/16 Javascript
webpack之引入图片的实现及问题
2018/10/08 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
jQuery实现文本显示一段时间后隐藏的方法分析
2019/06/20 jQuery
超轻量级的js时间库miment使用解析
2019/08/02 Javascript
Vue实现渲染数据后控制滚动条位置(推荐)
2019/12/09 Javascript
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
python通过imaplib模块读取gmail里邮件的方法
2015/05/08 Python
python根据京东商品url获取产品价格
2015/08/09 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
基于Python的XSS测试工具XSStrike使用方法
2017/07/29 Python
Python实现的多项式拟合功能示例【基于matplotlib】
2018/05/15 Python
Python之inspect模块实现获取加载模块路径的方法
2018/10/16 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
Django Model中字段(field)的各种选项说明
2020/05/19 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
英国领先的独立酒精饮料零售商:DrinkSupermarket
2021/01/13 全球购物
linux系统都有哪些运行级别
2016/03/26 面试题
经典演讲稿汇总
2014/05/19 职场文书
毕业生找工作求职信
2014/08/05 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
浪漫婚礼主题活动策划方案
2014/09/15 职场文书
个人三严三实对照检查材料
2014/09/25 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
公司业务员管理制度
2015/08/05 职场文书
某药房的新员工入职告知书!
2019/07/15 职场文书
Windows server 2003卸载和安装IIS的图文教程
2022/07/15 Servers