Dijkstra Python 实现
噜哩醤
编辑于 2024年03月19日 14:22

照着视频做了自己作业的Python 实现

我的作业要求

import numpy as np #need this for inf value

#dijkstra function, derivated from lecture note,

#input: adjecent matrix of the graph with corresponding weight of each edge

#input: starting source point

#output: shortest distant from source, previous visited point

def dijkstra(graph, source):

    #initializations

    V = len(graph)

    dist = [np.inf] * V

    prev = [None] * V

    dist[source] = 0

    Q = set(range(V))

    while Q:

        u = min(Q, key=lambda v: dist[v]) #find the smallest distance node. since source point is set to 0, the source will be first one

        Q.remove(u)

        for v in range(V):

            if graph[u][v] != np.inf:

                alt = dist[u] + graph[u][v]

                if alt < dist[v]:

                    dist[v] = alt

                    prev[v] = u

    return dist, prev

#main function, initial graph matrix here. and format a table using return value

if __name__ == '__main__':

    graph = [

        [0, 22, 9, 12, np.inf, np.inf, np.inf, np.inf, np.inf],

        [22, 0, 35, np.inf, np.inf, 36, np.inf, 34, np.inf],

        [9, 35, 0, 4, 65, 42, np.inf, np.inf, np.inf],

        [12, np.inf, 4, 0, 33, np.inf, np.inf, np.inf, 30],

        [np.inf, np.inf, 65, 33, 0, 18, 23, np.inf, np.inf],

        [np.inf, 36, 43, np.inf, 18, 0, 39, 24, np.inf],

        [np.inf, np.inf, np.inf, np.inf, 23, 39, 0, 25, 21],

        [np.inf, 34, np.inf, np.inf, np.inf, 24, 25, 0, 19],

        [np.inf, np.inf, np.inf, 30, np.inf, np.inf, 21, 19, 0]

    ]

    source = 0

    dist, prev = dijkstra(graph, source)

    dist.insert(0,"distance")

    prev.insert(0,"previous")

    data = [["vertices", "0", "1", "2", "3", "4", "5", "6", "7", "8"],

            dist,

            prev]

    print(data[0][0]+"   "+data[1][0]+"   "+data[2][0])

    for i in range(1, 10):

        print("   "+data[0][i]+"         "+str(data[1][i])+"         "+str(data[2][i]))