迪杰斯特拉(Dijkstra)算法(Python)

import numpy as np


def Input_Fun():
    n = int(input().strip())
    weight = []
    for i in range(n):
        temp = input().split(' ')
        for j in temp:
            weight.append(int(j))
    weights = np.array(weight).reshape(n, n)
    print(n)
    print(weights)
    return n, weights


def Result_Output(prev, i):
    if prev[i] != 0:
        Result_Output(prev, prev[i])
        print('->{}'.format(prev[i]+1), end='')


def Dijkstra():
    n, weights = Input_Fun()
    flag = np.zeros(n, bool)  # 设置标志,确认是否加入集合
    dist = weights[0]  # 记录第0点到各个位置的距离
    prev = np.zeros(n, int)  # 记录节点的前一个位置
    for i in range(n - 1):  # 进行n-1次迭代,每次加入一个点
        temp = float('inf')
        u = 0
        for j in range(n):
            if not flag[j] and dist[j] < temp and dist[j] != 0:  # 该点不在集合内、距离小、有连接
                u = j
                temp = dist[j]
        flag[u] = True
        for j in range(n):
            if not flag[j] and weights[u][j] != 0:
                if dist[u] + weights[u][j] < dist[j] or dist[j] == 0:
                    dist[j] = dist[u] + weights[u][j]
                    prev[j] = u
    for i in range(n - 1):
        print(dist[i + 1], ':1', end='')
        Result_Output(prev, i+1)
        print("->{}".format(i + 2))


if __name__ == '__main__':
    Dijkstra()