dijkstra求最短路的基本思路是貪心演算法,求解單源最短路。
適用於求解正權邊。
演算法的基本原理可以自行檢視。
這裡講解兩種求最短路的方法:
(1)、樸素演算法
樸素演算法的時間複雜度為o(n2),適用於稠密圖,用鄰接表來存圖,並且可以處理自環和重邊。
dijkstra求最短路 i
給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。
請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出-1。
輸入格式
第一行包含整數n和m。
接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。
輸出格式
輸出乙個整數,表示1號點到n號點的最短距離。
如果路徑不存在,則輸出-1。
資料範圍1≤
n≤500'>1≤n≤500
1≤n≤500,1≤
m≤105
'>1≤m≤105
1≤m≤105,
圖中涉及邊長均不超過10000。
輸入樣例:
3 3
1 2 2
2 3 1
1 3 4
輸出樣例:3
模板**:
#include#include#include
using
namespace
std;
const
int n=510
;int
n,m;
intq[n][n];
intd[n];
bool
f[n];
intdj()
if(d[n]==0x3f3f3f3f) return -1
;
return
d[n];
}int
main()
int k=dj();
printf(
"%d\n
",k);
return0;
}
(2)、堆優化演算法
dijkstra樸素演算法只能處理變數較小的情況,當邊數較多時間複雜度會變得特別大,鄰接表所需空間也會很大。
這裡就可以用到堆優化,堆優化主要適用於稀疏圖(稠密圖用也沒問題),也可以處理自環和重邊。
堆優化主要是用優先佇列來實現,用鄰接表存圖(鄰接表可以自己寫或者直接用vector),時間複雜度為o(m log n )。
模板題:
dijkstra求最短路 ii
給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為非負值。
請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出-1。
輸入格式
第一行包含整數n和m。
接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。
輸出格式
輸出乙個整數,表示1號點到n號點的最短距離。
如果路徑不存在,則輸出-1。
資料範圍1≤
n,m≤
1.5×105
'>1≤n,m≤1.5×105
1≤n,m≤1.5×105,
圖中涉及邊長均不小於0,且不超過10000。
輸入樣例:
3 3
1 2 2
2 3 1
1 3 4
輸出樣例:3
**:
#include#include#include
#include
#include
#include
using
namespace
std;
const
int n=1e5+10
;typedef pair
pii;
vector
v[n];
intd[n];
intn,m;
intdij()
);
while(!q.empty()));}
}}
if(d[n]==0x3f3f3f3f) return -1
;
return
d[n];
}int
main()
); }
int k=dij();
printf(
"%d\n
",k);
return0;
}
這裡用pair來存1到id距離和id,優先佇列預設以pair first從小到大排序。
Dijkstra求最短路(樸素and堆優化)
題目來自acwing 題目描述 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出 1。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示點x和點y之間存在一條有向邊,邊長為z。輸出格式...
Dijkstra演算法求最短路 樸素版
圖論中求最短路的演算法有很多,這裡使用一道模板題來介紹可以求單源最短路的dijkstra演算法 acwing 849.dijkstra求最短路 i 求乙個源點到 除了這個點之外其他所有的點 的最短距離,不需要記錄每條路徑 這題一直困惑著我的是,為什麼一開始找的最小的最短距離就是確定的最短距離?想了好...
Dijkstra求最短路 I(樸素演算法)
給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出 1。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。輸出格式 輸出乙個整數,表示1號點到n號...