import sys


def Dijkstra(graph, src):
    """
    :param graph: 邻接矩阵存储图
    :param src: 源点
    :return:
    """
    """
    path: 前驱节点
    dist: 最短路径长度
    final: 结点是否被访问标记[-1未被访问,0被访问]
    """

    """初始化path"""
    n = len(graph)
    path = [-1] * n
    dist = [sys.maxsize] * n
    dist[src] = 0
    final = [-1] * n
    final[src] = 0

    """初始化graph"""
    for i in range(len(graph)):
        for j in range(len(graph)):
            if graph[i][j] == 0:
                graph[i][j] = sys.maxsize
                
    """初始化dist"""
    for k in range(len(dist)):
        if graph[src][k] < dist[k]:
            dist[k] = graph[src][k]
            path[k] = src

    """寻找src最短距离"""
    for i in range(n):
        """每次最小值与下标"""
        min_dist = sys.maxsize
        min_dist_node = -1

        for j in range(len(dist)):
            if final[j] != 0 and dist[j] < min_dist:
                min_dist = dist[j]
                min_dist_node = j

        if min_dist_node != -1:
            num = min_dist_node
            """更新当前结点到各结点的距离,当前选择结点为num"""
            for u in range(len(graph[num])):
                if final[u] != 0 and graph[num][u] + dist[num] < dist[u]:
                    dist[u] = graph[num][u] + dist[num]
                    path[u] = num
            final[num] = 0
    return dist

if __name__ == '__main__':
    graph = [
        [0, 4, 0, 0, 0, 0, 0, 8, 0],
        [4, 0, 8, 0, 0, 0, 0, 11, 0],
        [0, 8, 0, 7, 0, 4, 0, 0, 2],
        [0, 0, 7, 0, 9, 14, 0, 0, 0],
        [0, 0, 0, 9, 0, 10, 0, 0, 0],
        [0, 0, 4, 14, 10, 0, 2, 0, 0],
        [0, 0, 0, 0, 0, 2, 0, 1, 6],
        [8, 11, 0, 0, 0, 0, 1, 0, 7],
        [0, 0, 2, 0, 0, 0, 6, 7, 0]
    ]
    print(Dijkstra(graph, 0))

操作步骤

  • 初始化

  • 选取更新结点

  • 对三个数组进行更新

注意要点

  • 注意初始化时各数组初始表示

  • 注意更新结点操作