Dijkstra算法求图中最短路径
时间:2022-07-28
本文章向大家介绍Dijkstra算法求图中最短路径,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在此借用上一篇文章[深度优先搜索(DFS)两点之间的可行路径](深度优先搜索(DFS)两点之间的可行路径)中的例子:
而Dijkstra主要用于解决有权图的最短路径求解,为了更好地演示Dijkstra的过程,可以为这个图的边加上权重,可以认为边的权重即为两点之间的距离:
显然,从1到6的路径中,权重和最短的路径有两条,一条是[1,2,4,5,6],另一条是[1,3,6],距离都是4。但是更大的图就不能仅凭肉眼判断了,下面将演示如何使用Dijkstra算法求出图中两点之间的距离。
graph = [
[2,3],
[4],
[4,6],
[5],
[6],
]
inf = 99999999
distance = [
[0,1,2,inf,inf,inf],
[inf,0,inf,1,inf,inf],
[inf,inf,0,2,inf,2],
[inf,inf,inf,0,1,inf],
[inf,inf,inf,inf,0,1],
[inf,inf,inf,inf,inf,0]
]
S = 1
D = 6
def Dijkstra(graph):
dis = distance[S-1]
# 最初U中只包含起点
U = [[S,[None],0]]
points = [i+1 for i in range(6)]
points.remove(S)
# V中包含除起点外的其他店
V = [[c,[S],dis[c-1]] for c in points]
while V:
# 从大到小排列
V = sorted(V,key=lambda x:x[2],reverse=True)
# 从V中取距离S最近的点,加入U中
item = V.pop()
U.append(item)
# 如果找到了终点就提前停止
if item == D:
break
# 遍历V,更新各点距离
for i,c in enumerate(V):
# 如果某点到S的距离小于某点经由item[0](上一个找到的点)到S的距离
# 则更新该点坐标,并将上一个找到的点作为该点的前置点
if dis[c[0]-1] > dis[item[0]-1] + distance[item[0]-1][c[0]-1]:
dis[c[0]-1] = dis[item[0]-1] + distance[item[0]-1][c[0]-1]
distance[S-1][c[0]-1] = dis[item[0]-1] + distance[item[0]-1][c[0]-1]
# 更新前置点
V[i][1] = [item[0]]
# 更新距离
V[i][2] = dis[c[0]-1]
elif dis[c[0]-1] == dis[item[0]-1] + distance[item[0]-1][c[0]-1]:
# 添加前置点
V[i][1].append(item[0])
else:
pass
return U
U = Dijkstra(graph)
print(U)
output:
[[1, [None], 0], [2, [1], 1], [3, [1], 2], [4, [2], 2], [5, [4], 3], [6, [3, 5], 4]]
可以看到从1到6的最短距离为4,并且路径中沿途的点都已经记录下来了。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 手写React-Router源码,深入理解其原理
- 深入Node.js的模块加载机制,手写require函数
- Redux异步解决方案之Redux-Thunk原理及源码解析
- MySQL设计与优化
- Elasticsearch学习笔记
- 《springboot实战》
- 360全国大学生信安技术大赛记录
- gh0st源码分析与远控的编写(四)
- 记一次Elasticsearch优化总结
- unix环境高级编程(上)-文件篇
- php webshell下直接反弹shell(不借助任何其他语言)
- XssHtml – 基于白名单的富文本XSS过滤类
- unix环境高级编程(下)-高级IO和进程间通信篇
- mybatis原理,配置介绍及源码分析
- web.py使用不当可能造成代码执行