给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径问题。利用Dijkstra算法计算图1中源点s到其他顶点的最短路径。
输入格式 第一行包含三个整数n,m,s分别表示点的个数、有向边的个数、出发点的编号。
接下来m行每行包含三个整数u,v,w 表示一条从u→v,长度为w的有向边。
输出格式 输出一行n个整数,第i个表示源点s到第i个点的最短路径,若不能达到则输出-9999.
输入样例
4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4
输出样例 0 2 4 3
import heapq
def dijkstra(n, m, s, edges):
inf = float('inf')
dist = [inf] * (n + 1)
dist[s] = 0
visited = [False] * (n + 1)
heap = [(0, s)]
while heap:
(d, u) =