給定乙個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]:
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])
單源最短路徑 SPFA演算法
求單源最短路徑的spfa演算法在bellman ford演算法的基礎上進行了改進,使其在能夠計算帶負權圖的單源最短路徑的基礎上,時間複雜度大幅度降低。時間複雜度 o k e k 2 基本演算法 設立乙個先進先出的佇列來儲存待優化的節點,優化時每次取出隊首節點u,並且用u點當前的最短路徑估計值對離開u...
Spfa單源最短路徑演算法
spfa 全稱shortest path faster algorithm,是求單源最短路徑的一種演算法.跟dijkstra類似,但是有一些不一樣。由於本人弱,不知道 有區別,請各位大神補充 我們來建乙個圖。首先,我們用e陣列表示各邊的關係,如下是初始狀態。我們開乙個dis陣列來儲存1號點到各點的最...
SPFA演算法求最短路
利用spfa演算法來解決hdu1874 首先了解一下spfa的相關概念 spfa可以處理負權邊 若給定的圖存在負權邊,類似dijkstra演算法等演算法便沒有了用武之地,spfa演算法便派上用場了。簡潔起見,我們約定加權有向圖g不存在負權迴路,即最短路徑一定存在。用陣列d記錄每個結點的最短路徑估計值...