有這麼幾種最短路演算法: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...