最後複習之最短路

2021-07-24 13:39:03 字數 1698 閱讀 1569

有這麼幾種最短路演算法:floyd、dijkstra、bellman-ford、spfa

一、floyd:

基本過程:列舉中間點,然後列舉起點和終點,用中間點去更新起點到終點的距離。

證明:用每個點去更新所有它能更新的點,是不是就是最短路了?(然而並不會證明)。

多源最短路、求最小環、判斷負環、適合稠密圖

求最小環:在求最大標號為n的最小環時,預習求出1-n-1的最短路,然後找出兩個點i,j,使得i到j的距離(不會經過n,因為只求了1-n-1的最短路)加上i和j到n的距離的和最小,這就是要求的最小環。

判斷負環:就是邊求邊判斷,如果存在點到自己的距離小於0,那麼就出現了負環。

模板題codevs 1557 熱浪

//我的floyd只有70分,不知道floyd能不能ac這個題

for (int k=1;k<=n;k++)

for (int i=1;i

<=n;i++)

if (i!=k)

for (int j=1;j

<=n;j++)

if (j!=k&&j!=i)

g[i]

[j]=min(g[i]

[j],g[i]

[k]+g[k]

二、dijkstra:
for (int i=1;i<=n;i++)

三、bellman-ford:基本過程:進行n-1遍對所有邊的鬆弛操作。

證明:每次至少將一條邊變成最終鬆弛狀態(就是不會再被用來鬆弛了)吧,然後圖中最長的最短路長度為n-1。

單源最短路、求最小環、判負環、適合稀疏圖

求最小環:和dijkstra差不多去刪邊。

判斷負環:在求完最短路之後如果還有邊可以鬆弛,那麼就存在負環。

for (int i=1;i

<=n-1;i++)

for (int j=1;j

<=2*m;j++)

四、spfa:基本過程:通過佇列,不斷地鬆弛一些邊,因為這些邊的終點到起點的距離變小了,那麼這些終點連線的其他點也可能可以更新,所以把這些終點們加入佇列,只要佇列裡還有點就要繼續進行,直到隊列為空方才求出最短路。

證明:只要可能能更新其他點的都進隊了,現在佇列空了,下面的事情。。。

單源最短路、求最小環、判斷負環、適合稀疏圖

求最小環:應該還是刪邊吧,另外附上一句上面求最小環除了floyd我都沒有試過(~(≧▽≦)/~啦啦啦)。

判斷負環:關於spfa判斷負環我只會乙個比較水方法,就是如果乙個點進隊次數超過n次那麼就存在負環,至於為什麼,我並不知道。

int head=1,tail=1

; memset(dis,127/2,sizeof(dis));

dui[1]=s;f[s]=1;dis[s]=0;

int a,b,len;

while (head<=tail)}}

head++;

f[a]=0

; }

最短路徑之最短路徑問題

提交 狀態 討論版 命題人 外部匯入 題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的 任務是找出從一點到另一點之間的最短路徑。輸入共n m 3行,...

訓練賽之 最短路

題意 給定n個點m條邊的無向圖 邊權全為1 讓你去掉最多的邊使得d s1,t1 l1 d s2,t2 l2,若不能滿足輸出 1,反之輸出可以去掉的最多邊數。思路 spfa預處理所有點之間的距離。求出在滿足d s1,t1 l1 d s2,t2 l2的前提下,路徑需要的最少邊數ans,答案就是m ans...

《Frogger》最短路之最長邊

題意就不贅述了.想講一講思路 我們要求得最長邊裡的最短.就要不斷去更新,到當前位置的最長邊裡的最短邊是什麼.所以也就是,我們的距離陣列中儲存的是,到當前點的所有路徑中的最長邊裡的最短邊.include include include include include include include i...