最短路系列鏈結
最短路總結1 最短路問題概述與樸素dijkstra
最短路總結2 堆優化dijkstra
最短路總結3 bellmanford
最短路總結4 spfa及應用
最短路總結5 floyd
1.最短路問題概述
若網路中的每條邊都有乙個數值(長度、成本、時間等),則找出兩節點(通常是源節點和阱節點)之間總權和最小的路徑就是最短路問題。最短路問題,其實就是給定乙個網路,給定乙個或一組起點(術語叫源點),對這些源點給定其他點,詢問這些點到源點的最短路徑。
2. 分類
單源是指單一起點到其他點的最短路,多源是指求每組起點到終點的最短路。
堆優化dijkstra是在樸素版基礎上,利用小根堆的自動維持順序的特性優化樸素版中的某一步。
spfa演算法一般不論稠密圖還是稀疏圖,都用鄰接矩陣儲存圖。
spfa演算法本質上是利用寬搜的思想對 bellerman-ford演算法做的優化,因此spfa很強大,在絕大多數情況下可以用spfa演算法代替bellman-ford演算法解決問題,因此重點掌握。(其實也可以代替dijkstra)
spfa演算法的侷限:當圖**現一下兩點之一時spfa演算法失效,只能使用bellman-ford演算法。
(1)限制最短路的路徑經過不超過k條邊
(2)圖中存在負權迴路(回路邊權之和為負數)
spfa演算法可以用來判斷是否存在負環,另:判斷正環用tanjar演算法
3.樸素dijkstra演算法(on^2+m)
初始化各點到源點的距離
迭代n-1次(除源點外有n-1個點)
(1)在最短路未確定的點中,找距離源點最近的點v。(用bool陣列標識該點的最短路是否已經確定)
(2)用v點去更新全圖所有點的當前最短路距離(dist)
(3)若i點滿足:dist[i] > dist[v] + w[v][i]
則更新i點的dist值
更新全圖後將該點設定為最短路已經確定
這裡假設找到的v點是2點,用2點去更新全圖,實際上這裡就是更新3點,也就相當於判斷這兩條到路徑誰更短:(1)1->2->3距離為dist[2]+w[2][3]
(2)1->3距離為dist[3]。推廣到更大更複雜的網路中,也是乙個個類似這樣去比較更新,比較完所有點,則v點不可能再被更新,所以設定v點的最短路已經確定。
4.模板
5.板子題int g[n]
[n];
// 儲存每條邊
int dist[n]
;// 儲存1號點到每個點的最短距離
bool st[n]
;// 儲存每個點的最短路是否已經確定
// 求1號點到n號點的最短路,如果不存在則返回-1
intdijkstra()
if(dist[n]
==0x3f3f3f3f
)return-1
;return dist[n]
;}
給定乙個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 31 2 2
2 3 1
1 3 4
輸出樣例:
3
6.小細節#include
#include
#include
#include
using
namespace std;
const
int n=
550,inf=
0x3f3f3f3f
;int n,m;
int g[n]
[n];
int dist[n]
;bool st[n]
;int
dijkstra()
st[t]=1
;}if(dist[n]
>=
1000000000
)return-1
;else
return dist[n];}
intmain()
}int t=
dijkstra()
; cout<
return0;
}
去重邊:在儲存圖時,取兩點之間多條邊的最短的那條
去自環:在儲存圖時,自己到自己的邊應當去除
無向邊:區別只在於儲存圖的時候,存兩邊,一去一回。
int x,y,z;
cin >> x >> y >> z;
if(x!=y)
最短路總結(1)
最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖 由結點和路徑組成的 中兩結點之間的最短路徑 這篇文章就是介紹幾種關於最短路徑的幾種演算法 1.定義 動態規劃以 途徑點集大小 為階段,以一種n nn的演算法,更新i j的最短路,列舉,乙個k點,為中轉點,然後判斷是直接的段還是間接的短 2.鄰...
最短路 最短路徑問題
題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...
最短路問題(1)
從圖中指定的一點出發走到某一目標點如果存在多種不同的走法,最短的是哪條路?其長度是多少?圖論中解決上述問題的方法都屬於最短路演算法。由於圖的特點不同 儲存結構不同 確立演算法的側重方向不同,所以演算法是多種多樣的。一 無權圖及樹網 在無權圖中,路徑長度只與路徑上的點數有關,而與路徑上的邊權和點權無關...