蓝桥杯 Python算法-算法训练 最短路

问题描述
给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。

输入格式
第一行两个整数n, m。

接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。

输出格式
共n-1行,第i行表示1号点到i+1号点的最短路。
样例输入
3 3
1 2 -1
2 3 -1
3 1 2
样例输出
-1
-2

最短路详细思路

因为可能有负权,又是求单源最短路径。所以我们使用简单的SPFA算法。

import queue
def spfa():
    q = queue.Queue()
    q.put(1) #开始结点1号入队
    in_queue[1] = 1 #标志其在队列中
    dis[1] = 0
    while not q.empty():
         u = q.get() #弹出队首结点
         in_queue[u] = 0
         for v in map_D[u]: #遍历u的所有邻接边u->v
             dis_v = map_D[u][v]
             if dis[v] > (dis[u]+dis_v): 
                 dis[v] = dis[u]+dis_v
                 if(in_queue[v] == 0): #如果v不在队列中,将v加入队列
                     in_queue[v] = 1
                     q.put(v)
if __name__=="__main__":
    n,m = map(int,input().split( ))
    map_D = {}
    dis = [float('inf') for i in range(n+1)]
    in_queue = [0 for i in range(n+1)]#判断是否结点在队列中
    for i in range(m):
        u,v,l = map(int,input().split( ))
        map_D.setdefault(u,{})[v] = l #使用值为字典的字典存放u->v边和其的权值l
    spfa()
    for i in range(2,n+1):
        print(dis[i])

你可能感兴趣的:(Python算法)