最短路 floyd,dijstra,spfa演算法

2021-09-27 11:03:35 字數 1142 閱讀 1593

一直想整理一下最短路,好久之前學的(都忘了差不多了),再回顧一下,增加印象

(被戲稱為五行演算法)它可以求出乙個圖中任意兩點之間的最短路距離,即多源最短路演算法,但是複雜度為o(n3)很大,所以一般比賽用到的機會很少,1s的時間要求下,最多只能求1000點之間的最短路。優點就是**短,好理解。

主要思想就是用圖中的乙個點k來判斷能不能優化i到j之間的最短距離。(列舉k點)。

**:

void floyd()

很好理解吧,就是列舉中間點 k,看 k 能不能優化 i 到 j 的最短路。

(被稱為最常用的最短路演算法),複雜度o(n2),雖然還是不怎麼低,但是解決大部分的最短路題還是可以的。這個演算法可以求乙個點到任何點的最短路距離,即單源最短路演算法。但是不能求存在負權邊的情況。

主要思想就是;把點分為兩類,一類是已經確定的最短路徑的點(標記點),一類是還沒有確定最短的點(未標記點),每次用這個已經找到的標記點來拓展未標記點,比如;b點是你已經找到的標記點,然後我發現找到最小的(含標記點)的邊有個e[b][c],那麼dis[c]的最短路距離就知道了dis[c]=dis[b]+e[b][c],(dis[i]表示為0點到i點的最短距離)。然後c就變成了標記點。但是此時只是在目前dis[c]是最短,但後面還有邊的時候dis[c]可能還能更新更短。所以沒到結束dis[i]都不一定是最短的。就這樣我們一直找未標記點,一直到最後乙個,找完了之後,此時dis[i]才真正是0到i點的最短距離。

**:

核心**:

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

mark[1]=1;

int minn,u;

for(int i=2;i<=n;i++)

}mark[u]=1;

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

}}

spfa演算法就是佇列優化過後的bellman-ford演算法,複雜度和邊有關,所以適用於稀疏圖,o(ke),k一般為二,e為這個圖的邊的數量。也是單源最短路演算法。spfa是可以處理負權邊存在的情況的。

主要思想:用鄰接表建圖,先存乙個首節點到棧中,然後出棧對這個節點的所以邊遍歷,優化每乙個點到首節點的最短距離,沒有進過棧的點進到棧中,直到棧空;

void spfa() }}

}}

最短路 最短路徑問題

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

最短路徑演算法 最短路

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

最短路(最短路之積)

首先考慮暴力維護,顯然極端資料就會炸裂,那麼用什麼來維護呢?考慮乙個很 nb的公式log n m log n log m ok,這道題到此結束 我們只要把乘積轉化為對數,最後再還原就可以了,也不用考慮精度問題,本蒟蒻試著用pow,然後它死了。includeusing namespace std co...