关于Dijkstra算法,有两个比较重要的点:
第一是递归
第二是父节点
通过递归可以用比较少的代码量实现算法本体(就几行而已),同时在递归结束后使用父节点逆推即可实现路线的回溯。
本代码逻辑为通过递归求得每一个节点离原点的最短路径长度,并使用父节点回推从而得到逆序路线,反转后即可输出。相关代码注释已标记
详细的算法逻辑参考其他解说和视频,以下代码是整个功能的实现,仅供参考,有任何问题欢迎评论和指正!
(注意:
输入为邻接矩阵(有向有权图),不可输入负权值,按步骤输入,不可非正常输入。
输出为最短路径长度以及最短路线。
import numpy as np
# ##########获取图、设置图########## #
n = int(input("输入点的个数:")) # 获取图的点个数
adjacent = np.zeros((n, n)) # 预生成一个长和宽为n,名为adjacent的邻接矩阵
best_result = np.zeros((n, n)) # 预生成一个长和宽为n,表示最优解路径的邻接矩阵
close = np.full(n, 999999) # 预生成一个存储每个节点到原点的最近距离的数组,原点默认距离为0
father = np.full(n, -1) # 预生成一个存储每个节点的父节点的数组,原点的父节点默认为-1
# ##########设置邻接矩阵########## #
print("输入邻接矩阵,一个回车输入一个数字,到自身距离

文章介绍了使用Dijkstra算法寻找有向有权图中两点间最短路径的方法,通过递归更新节点的最短距离和父节点信息。在递归结束后,利用父节点回溯得到最短路径。代码示例中,输入为邻接矩阵,输出为最短路径长度及路线。注意输入不能包含负权值。
最低0.47元/天 解锁文章
2937






