最短路大彙總

2021-08-17 02:02:17 字數 2151 閱讀 6096

鬆弛操作:當dis[i] > dis[j] + g[j][i]時 dis[i] = dis[j] + g[j][i]

dijkstra 

單源最短路 o(n^2)

本質是貪心 不能處理負邊

分成兩個集合 用vis標記 乙個是已經找到最短路的乙個是沒有找到最短路的

從已經找到最短路裡的點出發,進行鬆弛操作 找到其中最小的加入最短路的集合中 再從這個點接下去更新,做n-1次

所有的距離初始化為inf

#includeconst int n=100;  

const int inf=100000; //inf假定為無窮大

int p[n][n],d[n]; //p表示各節點間的距離,不存在路徑即為無窮大;d表示從出發節點到各節點的最短路徑長度

void dijkstra(int sec,int n) //sec為出發節點,n為圖中的節點數

; //用於標記是否已作為過中途節點,0表示沒有,1表示有

for(i=0;imin+p[min_num][j])

} }

} int main()

} }

spfa

演算法思想:我們用陣列d記錄每個結點的最短路徑估計值,用鄰接表來儲存圖g。我們採取的方法是動態逼近法:設立乙個先進先出的佇列用來儲存待優化的結點,優化時每次取出隊首結點u,並且用u點當前的最短路徑估計值對離開u點所指向的結點v進行鬆弛操作,如果v點的最短路徑估計值有所調整,且v點不在當前的佇列中,就將v點放入隊尾。這樣不斷從佇列中取出結點來進行鬆弛操作,直至佇列空為止

期望的時間複雜度o(ke), 其中k為所有頂點進隊的平均次數,可以證明k一般小於等於2。

如果某個點進入佇列的次數超過n次則存在負環(spfa無法處理帶負環的圖)

void spfa(int s)

dis[s] = 0;

vis[s] = true;

queueque;

que.push(s);

int i, v;

while(!que.empty())}}

}}

spfa演算法有兩個優化演算法 slf 和 lll:

slf:small label first 策略,設要加入的節點是j,隊首元素為i,若dist(j)否則插入隊尾。

lll:large label last 策略,設隊首元素為i,佇列中所有dist值的平均值為x,若dist(i)>x則將i插入

到隊尾,查詢下一元素,直到找到某一i使得dist(i)<=x,則將i出對進行鬆弛操作。

可用來解決查分約束問題:將不等式轉化為最短路問題【poj3159 candies】

floyd

任意兩點最短路 o(n^3)  可處理負邊

對於稀疏的圖,採用

於茂密的圖,可以使用

floyd

演算法。對於稀疏的圖,採用n次dijkstra比較出色,對於茂密的圖,可以使用floyd演算法。

i到j的最短距離不外乎存在經過i與j之間的k和不經過k兩種可能,所以可以令k=1,2,3,...,n(n是城市的數目),在檢查d(ij)與d(ik)+d(kj)的值;在此d(ik)與d(kj)分別是目前為止所知道的i到k與k到j的最短距離,因此d(ik)+d(kj)就是i到j經過k的最短距離。所以,若有d(ij)>d(ik)+d(kj),就表示從i出發經過k再到j的距離要比原來的i到j距離短,自然把i到j的d(ij)重寫為d(ik)+d(kj),每當乙個k查完了,d(ij)就是目前的i到j的最短距離。重複這一過程,最後當查完所有的k時,d(ij)裡面存放的就是i到j之間的最短距離了。

for(int k=0; k

for(int i=0; i

for(int j=0; j

輸出路徑:

p(ij)的值如果為p,就表示i到j的最短行經為i->...->p->j,也就是說p是i到j的最短行徑中的j之前的最後乙個城市

一旦發現d(ij)>d(ik)+d(kj),就把p(kj)存入p(ij)

n次tra

,對於茂密的圖,可以使用

floyd

演算法。小技巧:

稀疏圖使用鄰接表儲存

最短路演算法彙總

1 dijkstra dijkstra演算法的思想是一種貪心的思想,它求得是單源最短路的問題,設定乙個頂點的集合,初始集合是源點,然後從源點出發,找到最近的點把該點納入這個集合,然後再從這個集合出發,把離源點最近的點納入集合,直到把所有的點納入集合。最後的到的即是從源點出發到其它所有的點的最短距離。...

最短路 最短路徑問題

題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...