spfa求最短路徑

2021-10-08 18:20:07 字數 1208 閱讀 1614

給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環, 邊權可能為負數。

請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出impossible。

資料保證不存在負權迴路。

輸入格式

第一行包含整數n和m。

接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。

輸出格式

輸出乙個整數,表示1號點到n號點的最短距離。

如果路徑不存在,則輸出」impossible」。

資料範圍

1≤n,m≤105

,圖中涉及邊長絕對值均不超過10000。

輸入樣例:

3 31 2 5

2 3 -3

1 3 4

輸出樣例:

2給定一張圖,對於圖中的x,y,z,有d[y]<=d[x]+z成立那麼就稱為這條邊滿足三角形不等式,如果所有的邊都滿足三角形不等式,那麼d陣列就是所求的最短路徑。演算法流程:

1:首先建立乙個佇列,最初佇列中只含有起點1;

2:取出對頭元素x,掃瞄他的所有出邊,(x,y,z),如果d[y]>d[x]+z,則使用d[x]+z更新d[y],同時y不在佇列中,則把y入隊

3:重複上述步驟,知道隊列為空

#include

using

namespace std;

const

int n=

100010

;int head[n]

,ver[n]

,next1[n]

,d[n]

,edge[n]

;int n,m,tot;

queue<

int> q;

bool v[n]

;void

add(

int x,

int y,

int z)

intspaf()

}}return d[n];}

intmain()

int t=

spaf()

;if(t==

0x3f3f3f3f

) cout<<

"impossible"

;else

printf

("%d"

,d[n]);

return0;

}

spfa求最短路

給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出impossible。資料保證不存在負權迴路。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示點x和點y之間存在一條有向邊,邊長為z。輸...

spfa求最短路

題目鏈結 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出impossible。資料保證不存在負權迴路。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊...

spfa求最短路

給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出impossible。資料保證不存在負權迴路。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。輸...