最短路 Dijstra演算法和spfa演算法模板

2021-10-03 01:57:18 字數 2248 閱讀 8596

一:dijstra模板

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

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

輸入格式

第一行包含整數n和m。

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

輸出格式

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

如果路徑不存在,則輸出-1。

資料範圍

1≤n≤5001≤n≤500,

1≤m≤1051≤m≤105,

圖中涉及邊長均不超過10000。

輸入樣例:

3 3

1 2 2

2 3 1

1 3 4

輸出樣例:

3
思路:

bool st[n]; //用於在更新最短距離時 判斷當前的點的最短距離是否確定 是否需要更新

int dist[n];//用於儲存每個點到起點的最短距離

int n,m;

int dijstra()

if(dist[n]==0x3f3f3f3f) return -1;

return dist[n];

}int main()

int t=dijstra();

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

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

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

輸入格式

第一行包含整數n和m。

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

輸出格式

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

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

資料範圍

1≤n,m≤1051≤n,m≤105,

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

輸入樣例:

3 31 2 5

2 3 -3

1 3 4

輸出樣例:

2
spfa 演算法是 bellman-ford演算法 的佇列優化演算法的別稱,通常用於求含負權邊的單源最短路徑,以及判負權環。spfa一般情況複雜度是o(m)o(m) 最壞情況下複雜度和樸素 bellman-ford 相同,為o(nm)o(nm)。

2、spfa演算法步驟

queue

while queue 不為空

(1) t

queue.pop()

(2)用 t 更新所有出邊 t –> b,權值為w

queue

時間複雜度 一般:o(m) 最壞:o(nm)

n為點數,m為邊數

#include #include #include #include using namespace std;

const int n=100010;

int h[n],e[n],ne[n],w[n],idx;

bool st[n];

int dist[n];

int n,m;

void add(int a,int b,int c)

int spfa()}}

}if(dist[n]==0x3f3f3f3f) return -1;

return dist[n];

}int main()

int t=spfa();

if(t==-1) puts("impossible");

else

printf("%d",t);

}

最短路(Dijstra演算法)

一,問題基本概念 最短路問題 若網路中的每條邊都有乙個數值 長度,時間,成本等 則找出兩點 通常是源節點和阱節點 之間總權和最小的路徑就是最短路問題。單源最短路 可以採用dijkstra演算法 但是只可以求無負權的最短路徑 時間複雜度為o v 2 如果圖中又負權賄賂,可以採用bellman ford...

最短路徑 Dijstra演算法(單源)

定義 所謂最短路徑問題是指 如果從圖中某一頂點 源點 到達另一頂點 終點 的路徑可能不止一條,如何找到一條路徑使得沿此路徑上各邊的權值總和 稱為路徑長度 達到最小。dijkstra 迪傑斯特拉 演算法 他的演算法思想是按路徑長度遞增的次序一步一步併入來求取,是貪心演算法的乙個應用,用來解決單源點到其...

Dijstra演算法 單源最短路徑演算法

用dis陣列記錄起點到其餘所有點的最短路徑 include iostream include cstdio define inf 99999999 using namespace std int map 100 100 int dis 100 int book 100 book陣列記錄那些點已經被利...