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 18 Python
Django中URLconf和include()的协同工作方法
Jul 20 Python
Python文件的读写和异常代码示例
Oct 31 Python
点球小游戏python脚本
May 22 Python
深入分析python中整型不会溢出问题
Jun 18 Python
Python学习笔记之变量、自定义函数用法示例
May 28 Python
浅谈django2.0 ForeignKey参数的变化
Aug 06 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
Feb 27 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
Apr 01 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
Apr 12 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
Jun 28 Python
Python创建简单的神经网络实例讲解
Jan 04 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
ezSQL PHP数据库操作类库
2010/05/16 PHP
php如何调用webservice应用介绍
2012/11/24 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
php使用fsockopen函数发送post,get请求获取网页内容的方法
2014/11/15 PHP
thinkPHP模板算术运算相关函数用法分析
2016/07/12 PHP
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
基于jquery的地址栏射击游戏代码
2011/03/10 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
客户端js判断文件类型和文件大小即限制上传大小
2013/11/20 Javascript
javascript 数组操作详解
2015/01/29 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
2016/11/15 Javascript
使用原生js+canvas实现模拟心电图的实例
2017/09/20 Javascript
Vue.js 2.5新特性介绍(推荐)
2017/10/24 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
JS中准确判断变量类型的方法
2020/06/01 Javascript
详解javascript void(0)
2020/07/13 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python复制文件代码实现
2013/12/23 Python
在Django的视图中使用form对象的方法
2015/07/18 Python
python实现学生信息管理系统
2020/04/05 Python
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
python读取yaml文件后修改写入本地实例
2020/04/27 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
Farfetch香港官网:汇集全球时尚奢侈品购物平台
2017/11/26 全球购物
岗位职责定义及内容
2013/11/08 职场文书
服务员岗位职责
2014/01/29 职场文书
锦旗标语大全
2014/06/23 职场文书
三好生演讲稿
2014/09/12 职场文书
运动会广播稿100字
2014/09/14 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
2014最新股权信托合同协议书
2014/11/18 职场文书
2015年乡镇信访工作总结
2015/04/07 职场文书