标签:dist idx Python wei spfa ne 算法 impossible 号点
题目:
给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数。
请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出impossible。
数据保证不存在负权回路。
输入格式
第一行包含整数n和m。
接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。
输出格式
输出一个整数,表示1号点到n号点的最短距离。
如果路径不存在,则输出”impossible”。
数据范围
1≤n,m≤10^5
图中涉及边长绝对值均不超过10000。
输入样例:
3 3
1 2 5
2 3 -3
1 3 4
输出样例:
2
代码:
n, m = map(int, input().split())
idx = 0
h = [-1]*(n+1)
e, ne, w = [0]*(2*m+1), [0]*(2*m+1), [0]*(2*m+1)
dist = [float('inf')]*(n+1)
def add(a, b, wei):
global idx
e[idx], w[idx] = b, wei
h[a], ne[idx] = idx, h[a]
idx += 1
def spfa():
queue = [1]
st = [False]*(n+1) # 用来判断当前点是否在队列中
dist[1] = 0
hh, tt = 0, 0
while hh <= tt:
t = queue[hh]; hh += 1
st[t] = False
i = h[t]
while i != -1:
j, wei = e[i], w[i]
if dist[j] > dist[t] + wei:
dist[j] = dist[t] + wei
if not st[j]:
queue.append(j)
st[j] = True
tt += 1
i = ne[i]
for _ in range(m):
a, b, wei = map(int, input().split())
add(a, b, wei)
spfa()
if dist[n] == float('inf'): print('impossible')
else: print(dist[n])
标签:dist,idx,Python,wei,spfa,ne,算法,impossible,号点 来源: https://blog.csdn.net/blowfire123/article/details/110411497
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。