2020.05.21-00:362020.05.21-11:251.完善dijkstra
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 如果...