python实现Dijkstra算法

python实现Dijkstra算法

做一个拓扑构图的项目,用python实现一下很久没用的Dijkstra算法,可实现有/无向图的最短路径计算,代码改编自巫泽俊《挑战程序设计竞赛第2版》:

# _*_ encoding:utf-8 _*_
# 辅助信息
# 图中的顶点数
import math
V = 6
# 标记数组:used[v]值为False说明改顶点还没有访问过,在S中,否则在U中!
used = [False for _ in range(V)]
# 距离数组:distance[i]表示从源点s到i的最短距离,distance[s]=0
distance = [float('inf') for _ in range(V)]
# cost[u][v]表示边e=(u,v)的权值,不存在时设为INF
# cost领接表
cost = [[float('inf') for _ in range(V)] for _ in range(V)]
def dijkstra(s):
    distance[s] = 0
    while True:
        # v在这里相当于是一个哨兵,对包含起点s做统一处理!
        v = -1
        # 从未使用过的顶点中选择一个距离最小的顶点
        for u in range(V):
            if not used[u] and (v == -1 or distance[u] < distance[v]):
                v = u
        if v == -1:
            # 说明所有顶点都维护到S中了!
            break

        # 将选定的顶点加入到S中, 同时进行距离更新
        used[v] = True
        # 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。
        for u in range(V):
            distance[u] = min(distance[u], distance[v] + cost[v][u])

# if __name__ == '__main__':
#
for _ in range(9):
    v, u, w = list(map(int, input().split()))
    cost[v][u] = w
    cost[u][v] = w
s = int(input('请输入一个起始点:'))
dijkstra(s)
print(distance)

# # 有/无向图最短路径
# 输入示例:
# 0 1 1
# 0 2 2
# 0 3 3
# 1 4 7
# 1 5 9
# 2 4 4
# 3 4 5
# 3 5 6
# 4 5 8

无向图示例:python实现Dijkstra算法_第1张图片
输出结果:
python实现Dijkstra算法_第2张图片

你可能感兴趣的:(python,算法,数据结构,图论)