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使用smtplib模块发送电子邮件的流程详解
Jun 27 Python
python 显示数组全部元素的方法
Apr 19 Python
python numpy 部分排序 寻找最大的前几个数的方法
Jun 27 Python
python实现批量视频分帧、保存视频帧
May 31 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
Jun 03 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
django自定义模板标签过程解析
Dec 14 Python
python设置环境变量的作用整理
Feb 17 Python
Python实现密钥密码(加解密)实例详解
Apr 26 Python
Python如何实现后端自定义认证并实现多条件登陆
Jun 22 Python
python 爬虫爬取京东ps4售卖情况
Dec 18 Python
使用python求解迷宫问题的三种实现方法
Mar 17 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编程过程中需要了解的this,self,parent的区别
2009/12/30 PHP
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
curl和libcurl的区别简介
2015/07/01 PHP
PHP基于curl后台远程登录正方教务系统的方法
2016/10/14 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
javascript String 的扩展方法集合
2008/06/01 Javascript
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
Angular中自定义Debounce Click指令防止重复点击
2017/07/26 Javascript
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
Python实现竖排打印传单手机号码易撕条
2015/03/16 Python
Python lxml模块安装教程
2015/06/02 Python
Python 爬虫学习笔记之正则表达式
2016/09/21 Python
Python基于递归实现电话号码映射功能示例
2018/04/13 Python
pow在python中的含义及用法
2019/07/11 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
django 实现celery动态设置周期任务执行时间
2019/11/19 Python
Tensorflow 多线程与多进程数据加载实例
2020/02/05 Python
python的列表List求均值和中位数实例
2020/03/03 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
2020/04/27 Python
Django如何实现防止XSS攻击
2020/10/13 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
苹果香港官方商城:Apple香港
2016/09/14 全球购物
TCP/IP的分层模型
2013/10/27 面试题
小车司机岗位职责
2013/11/25 职场文书
写好自荐信需做到的5要点
2014/03/07 职场文书
给全校老师的建议书
2014/03/13 职场文书
学生实习证明范文
2014/09/28 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
oracle重置序列从0开始递增1
2022/02/28 Oracle
Python四款GUI图形界面库介绍
2022/06/05 Python