演算法題 spfa演算法求單源最短路(Python)

2021-10-11 01:39:23 字數 1367 閱讀 9191

給定乙個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記錄每個結點的最短路徑估計值...