一: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陣列記錄那些點已經被利...