图算法之dijkstra算法(python实现)

以此图为例:
在这里插入图片描述
代码:

print("请输入顶点个数")
vertex_num = int(input())
print("请输入边的条数")
edge_num = int(input())
print("请输入源点")
start = int(input())
print("请依次输入顶点之间路径长度")


fmax = float('inf')
# 初始化邻接矩阵
graph = [[fmax for _ in range(vertex_num)] for _ in range(vertex_num)]
# 初始化源点到各个点的距离数组
dist = [fmax for _ in range(vertex_num)]
# 初始化源点到各个点的路径数组
path = [-1 for _ in range(vertex_num)]
# 用来存放已经确认最短距离的点
T = []
# 创建图
for i in range(edge_num):
    path_list = input().split(" ")
    graph[int(path_list[0])][int(path_list[1])] = int(path_list[2])


def dijkstra(graph, s):
    for i in range(vertex_num):
        # 初始化dist数组
        dist[i] = graph[s][i]
        # 初始化path数组
        if graph[s][i] < fmax:
            path[i] = s
    # 初始化顶点集
    T.append(s)

    while len(T) != vertex_num:  # 如果顶点集T没有满,就一直循环

        temp_num = fmax
        for vertex in range(vertex_num):
            if vertex not in T:  # 如果顶点没被加入到T中,表明从源点到该顶点的最短距离还没确定
                if dist[vertex] < temp_num:
                    temp_num = dist[vertex]
        min_vertex = dist.index(temp_num)
        if min_vertex in T:  # 判断取出的最短距离的点是不是之前已经确认了(针对有路径相同的点)
            min_vertex = dist.index(temp_num, min_vertex+1)  # 如果确认了,就找下一个点
        # 将确认了最短路径的点,加入到顶点集
        T.append(min_vertex)
        # 找min_index的出度点
        for i in range(vertex_num):
            if graph[min_vertex][i] != fmax and i not in T:
                if dist[i] > dist[min_vertex] + graph[min_vertex][i]:
                    dist[i] = dist[min_vertex] + graph[min_vertex][i]
                    path[i] = min_vertex
    return dist, path


dist, path = dijkstra(graph, start)

print("源点到各个点的距离:", end=" ")
print(dist)
print("路径:", end=" ")
print(path)
输入:
请输入顶点个数
5
请输入边的条数
6
请输入源点
0
请依次输入顶点之间路径长度
0 1 1
0 2 2
0 3 1
1 2 1
2 4 1
3 4 1
输出:
源点到各个点的距离: [inf, 1, 2, 1, 2]
路径: [-1, 0, 0, 0, 3]

猜你喜欢

转载自blog.csdn.net/bradyM/article/details/126149321