演算法初探 最短路徑

2022-05-25 11:48:14 字數 2122 閱讀 3436

2020.05.21-00:36

1.完善dijkstra

2020.05.21-11:25

1.完善dijkstra堆優化

2020.06.11-17:43

1.更新內容

最短路演算法是圖論演算法必學演算法之一

那麼既然它這麼重要,就更需要我們深入了解,熟練掌握

(預設圖為連通圖)

有點貪心動規的意思

那麼依此類推,最後終將推到乙個最最最簡單的問題:兩點間的最短路

這個問題只要你會存圖就會做

(很像動態規劃對不對)

^rt,我們要求出1-5的最短路徑

就必須求出起點到中轉點的最短路徑,中轉點為4

想求出1-4的最短路徑,就先去求1-3的最短路徑

同理求1-2的最短路

而1-2的最短路就是其連線的邊的權值

演算法思路:

定義變數(鏈式前向星的那堆變數就不再重複寫了):

dis[i]:表示從起點到i的最短距離

f[i]:記錄這條邊有沒有被確定過最短路

s表示起點

初始化:dis[i]=∞;dis[s]=0

遍歷每乙個點

#includeusing namespace std;

#define num 500050

#define inf 2147483647

struct edgee[num];

int head[num],dis[num],num,n,m,s,u,v,w,minn;

bool f[num];

inline void add(int f,int t,int w)

int main()

//初始化

for(int i=1;i<=n;i++) dis[i]=inf;

dis[s]=0;

//遍歷每乙個點

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

//演算法結束,輸出s到各點的最短距離

for(int i=1;i<=n;i++) cout我們可以發現,對於原來的dijkstra演算法,每次查詢最小值時間複雜度都為o(n)

這顯然很慢啊!!!

那麼有什麼演算法可以在常數時間內求出最小值呢?

當然是(線段樹)堆啦!

建立乙個小根堆,即可迅速求出所有資料的最小值

整個演算法的複雜度也降低了不少

我們發現,對於每次掃瞄,會有一些資料已經確定過最小值,再次進行掃瞄會浪費時間

所以我們要使用佇列來實現

最終結論:用優先佇列+二元組實現

明白了這個之後,這道題對你來說+岩漿=黑曜石

#include#include#include#includeusing namespace std;

#define ll int

#define num 500050

#define inf 2147483647

struct edgee[num];

ll head[num],dis[num],num,n,m,s,u,v,w,minn,bf,i;

bool f[num];

priority_queue,vector>,greater> >q;

inline void add(int f,int t,int w)

inline int read()

while (c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();

return x*w;

}int main(){

n=read();m=read();s=read();

for(i=0;i那麼至於為什麼make_pair的引數是最短距離,邊的終點呢?

為什麼不反過來存或存其他的引數呢

因為這是個自動排序的優先佇列

因為二元組自帶排序規則

Dijkstra最短路徑演算法初探

資料來源 一組頂點 vi i 1 n 頂點間通路 vi,vj 通路的距離 dis i,j 目標 任意給定一組起點 s,終點 d,計算 s d之間的最短距離 並給出通路。演算法輸入資料舉例如下 4 四個頂點 4 四個通路 1 2 4 頂點1 到頂點2 存在距離為 4的通路 1 3 5 2 4 3 3 ...

最短路徑演算法 最短路

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

最短路徑演算法

floyd演算法 012345 001 54 1108 1 2 801 3 3 1035 45 302 5413520 floyd 演算法過程描述如下 首先 以邊集 初始化,得到所有的直接連通代價 依次考慮第 k個結點,對於 中的每乙個 i j 判斷是否滿足 s i j s i k s k j 如果...