Dijkstra算法 python实现

时间:2020-10-16
本文章向大家介绍Dijkstra算法 python实现,主要包括Dijkstra算法 python实现使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Dijkstra算法

简介:

Dijkstra算法是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。

算法介绍推荐文章:

https://www.zhihu.com/question/20630094/answer/758191548

假设有图G:

则G的带权邻接矩阵为:

matrix = [
    [99, 2, 99, 6, 99, 9, 99, 99], 
    [99, 99, 30, 1, 99, 99, 99, 99], 
    [99, 99, 99, 99, 99, 99, 99, 5], 
    [99, 99, 99, 99, 2, 99, 99, 99], 
    [99, 99, 8, 99, 99, 99, 7, 99], 
    [99, 99, 99, 99, 3, 99, 24, 99], 
    [99, 99, 99, 99, 99, 99, 99, 21], 
    [99, 99, 99, 99, 99, 99, 99, 99]]

则时间复杂度为\(O\left( n^2 \right)\)的算法如下图(python语言):

n = len(matrix) # 计算顶点数量

# v记录是否访问 
# dis为起始结点到相邻结点的距离
v = [0]*n 
dis = matrix[0].copy()

# 起始情况
v[0] = 1
dis[0] = 99

# 循环n次
for _ in range(n):
    # 找出与集合相邻且距离起点最近的点 
    k = 0
    for j in range(n):
        if v[j] == 0 and dis[j] < dis[k]:
            k = j
	# 该点被访问
    v[k] = 1

    # 用该点进行松弛(relax)
    for j in range(n):
        if v[j] == 0 and dis[k] + matrix[k][j] < dis[j]:
            dis[j] = dis[k] + matrix[k][j]

结果:

dis = [99, 2, 13, 3, 5, 9, 12, 18]

$flag 上一页 下一页