一、 迪杰斯特拉算法思想
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),直到遍历完所有顶点。
三、 Python源码
图使用邻接矩阵存储,本部分代码改编自巫泽俊《挑战程序设计竞赛第2版》

# _*_ encoding:utf-8 _*_
# 辅助信息
# 图中的顶点数
V = 7
# 标记数组:used[v]值为False说明改顶点还没有访问过,在S中,否则在U中!
used = [False for _ in range(V)]
# 距离数组:distance[i]表示从源点s到i的最短距离,distance[s]=0
distance = [float('inf') for _ in range(V)]
# cost[u][v]表示边e=(u,v)的权值,不存在时设为INF
cost = [[float('inf') for _ in range(V)] for _ in range(V)]def dijkstra(s):distance[s] = 0while True:# v在这里相当于是一个哨兵,对包含起点s做统一处理!v = -1# 从未使用过的顶点中选择一个距离最小的顶点for u in range(V):if not used[u] and (v == -1 or distance[u] < distance[v]):v = uif v == -1:# 说明所有顶点都维护到S中了!break# 将选定的顶点加入到S中, 同时进行距离更新used[v] = True# 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。for u in range(V):distance[u] = min(distance[u], distance[v] + cost[v][u])if __name__ == '__main__':for _ in range(12):v, u, w = list(map(int, input().split()))cost[v][u] = ws = int(input('请输入一个起始点:'))dijkstra(s)print(distance)

四、 源码分析

  1. 数据结构:cost邻接矩阵存储的是图中边的信息;distance距离数组维护的是从源起点s到其他顶点的最短距离,是一个频繁变动的数据结构;used布尔数组标记了顶点有没有使用过,即used数组中值为True的顶点元素加入到了S中,值为False的顶点元素加入到了U中,最后所有顶点加入到S中即used的所有元素值为False。同时初始化是将cost所有边权重初始化为无穷大,float(‘inf’
  2. 顶点编号为0,1,2…V-1,为了对包括起点在内的所有顶点统一处理,设置了一个哨兵v(初始化为-1),哨兵v代表每次筛选出来的要加入到S中的距离最小的顶点元素,同时,如果所有顶点都加入到S中后,v的值仍为-1,可以做为循环结束的标记!

Python实现迪杰斯特拉算法相关推荐

  1. python写算法求最短路径,Python实现迪杰斯特拉算法并生成最短路径的示例代码

    def Dijkstra(network,s,d):#迪杰斯特拉算法算s-d的最短路径,并返回该路径和代价 print("Start Dijstra Path--") path=[ ...

  2. Python实现迪杰斯特拉算法和贝尔曼福特算法求解最短路径

    文章目录 (一).题目 (二).导库 (三).绘制带权无向图 (四).获得最短路径 (四).实现最短路径高亮 (五).完整代码 (六).结果展示 关于Python数据分析在数学建模中的更多相关应用:P ...

  3. python做算法分析_Python实现迪杰斯特拉算法过程解析

    一. 迪杰斯特拉算法思想 dijkstra算法主要针对的是有向图的单元最短路径问题,且不能出现权值为负的情况!dijkstra算法类似于贪心算法,其应用根本在于最短路径的最优子结构性质. 最短路径的最 ...

  4. 迪杰斯特拉算法python实现

    回顾下最短路径的地杰斯特拉算法 迪杰斯特拉算法是求从某一个起点到其余所有结点的最短路径,是一对多的映射关系,是一种贪婪算法 示例: 算法实现流程思路: 迪杰斯特拉算法每次只找离起点最近的一个结点,并将 ...

  5. 图的最短路径之(迪杰斯特拉算法)python实现

    前面我们已经了解到了无环有向图怎样求关键路径的方法,今天我们来看看无向图怎样求最短路径,这在实际应用过程中的作用很大,不如交通路线图,从出发点到终点,走哪条路用时最短,或者花费最少等问题. 我们先来看 ...

  6. 计算机网络课程实验4——编程实现路由算法(迪杰斯特拉算法)

    实验目的: 运用各种编程语言实现基于 Dijkstra 算法的路由软件. 实验意义: 通过本实验,使学生能够对路由原理和路由算法有进一步的理解和掌握. 实验步骤: 1, 选择合适的编程语言编程实现基于 ...

  7. 迪杰斯特拉算法-西安地铁最短路线问题

    文章说明 图是一种较线性表和树更为复杂的数据结构,在各个领域都有着广泛的应用,如城市交通.电路网络分析.交通灯的设置等,其中,最短路径问题的求解是日常生活中最为常见的问题.在现实生活和生产实践中,有许 ...

  8. 算法系列——迪杰斯特拉算法(Dijkstra)

    本系列旨在用简单的人话讲解算法,尽可能避免晦涩的定义,读者可以短时间内理解算法原理及应用细节.我在努力! 本篇文章编程语言为Python,供参考. 迪杰斯特拉算法(Dijkstra) 典型最短路径算法 ...

  9. 迪杰斯特拉算法(C语言实现)

    迪杰斯特拉算法(C语言实现) 如上图,求以a为源点到个顶点的最短路劲. #include "stdio.h" #include "stdlib.h" //用一个 ...

最新文章

  1. 干货丨一文读懂深度学习(附学习资源,据说点赞2W+)
  2. SQL中常用的日期计算
  3. 国资委:九月份常州光伏出口大增 新兴市场增幅亮眼
  4. k8s Pod亲和性:pod与pod的亲和性
  5. NeurIPS 2021 | 通过寻找平坦最小值,克服小样本增量学习中的灾难性遗忘
  6. 京东搞促销,天猫下黑手
  7. ASP.NET Core学习资源汇总
  8. 3三星闪存刷梅林_三星电子副会长李在镕造访西安
  9. 生化危机5 / BIOHAZARD5 简直就是一款完美的印钞机?(+2009.4.9)
  10. Mysql的七种表类型
  11. 《C语言及程序设计》实践参考——找数字
  12. 软件设计过程--概要设计详细设计
  13. vue+lodop打印快递面单
  14. amcharts4饼状图显示百分比的小数点设置
  15. DBeaver复制数据库报错@@GLOBAL.GTID_PURGED cannot be changed: the added gtid set must not overlap with @@GLO
  16. idea保存快捷键_windows10下idea快捷键文件
  17. (int)类型和(int )类型的区别
  18. gmail imap_阻止带有Gmail IMAP的Outlook在待办事项栏中显示重复的任务
  19. Excel之如何使用VLOOKUP函数合并两张表
  20. python与数据库连接语句_python 链接数据库语句

热门文章

  1. 符号引用和直接引用的区别
  2. HP T530瘦客户机上部署 朵拉云DoraOS连接华为桌面云
  3. Flask搭建api服务-生成API文档
  4. elasticsearch-7-x使用xpack进行安全认证
  5. 批量将Visio文件转为SVG
  6. [转]维基百科数据导入
  7. 七夕送男朋友什么礼物最好?七夕送男朋友礼物排行榜
  8. 转载:CSDN快速转载文章方法(简单)
  9. 《牛客网 剑指Offer前20题》
  10. Android App发布到应用市场的流程