P4779 模板 單源最短路徑(標準版)題解

2022-02-17 17:31:58 字數 2691 閱讀 8087

原題鏈結 

若還未食用弱化版的同學請先做這個qwq 

剛剛做完了弱化版的我,看到了這個標準版 雙倍經驗美滋滋qwq

把弱化版的spfa模板打上去,改了下資料範圍,提交!悲催的tle了四個點!

很顯然,這個題的資料是卡spfa的,使得時間複雜度是spfa最壞的複雜度!

那咋辦呢?我們看到了

題目中已經說明了沒有負權邊,那麼我們就可以用時間複雜度更為穩定的dijkstra演算法!

介紹一下下演算法原理及實現:

假設我們有白點和藍點,藍點表示還未被鬆弛的點,白點表示已經鬆弛過的點,vis[i]=1代表是白點已經被鬆弛過了,vis[i]=0代表是藍點還未被鬆弛過。我們的目標就是將所有的藍點轉化成白點;

1.從起點s開始,鬆弛它所有的出邊,若某條邊鬆弛成功且這條邊的終點不在佇列裡,就讓它入隊,將起點標記為白點:vis[s]=1;

2.找到乙個距離起點s最小的點(用優先佇列實現),若該點是藍點,那麼鬆弛它所有的出邊,若某條邊鬆弛成功且這條邊的終點不在佇列裡,就讓它入隊,將起點標記為白點:vis[i]=1;

重複第2個步驟,直到隊列為空。

當所有邊長都是非負數的時候,全域性最小值不可能再被其他節點更新.所以在第22步中找出的藍點xx必然滿足:dis[x]:dis[x]已經是起點到xx的最短路徑..我們不斷選擇全域性最小值進行標記和拓展,最終可以得到起點到每個節點的最短路徑的長度。

演算法**

1.選定a節點並初始化,如上述步驟3所示

2.執行上述 4、5兩步驟,找出u集合中路徑最短的節點d 加入s集合,並根據條件if ( 'd 到 b,c,e 的距離' + 'ad 距離' < 'a 到 b,c,e 的距離' )來更新u集合

3.這時候a->b, a->c都為3,沒關係。其實這時候他倆都是最短距離,如果從演算法邏輯來講的話,會先取到b點。而這個時候 if 條件變成了if ( 'b 到 c,e 的距離' + 'ab 距離' < 'a 到 c,e 的距離' )如圖所示這時候a->b距離 其實為a->d->b

4.思路就是這樣,往後就是大同小異了

說了這麼多,下面上**:

#include#include

#include

#include

using

namespace

std;

int edge_sum; //

暫時存邊數

intn,m,s;

const

int inf=1e9;

intread()

returna;}

int head[200001],vis[100001],dis[100001]; //

head[i]表示以i結點為始點的最後一條出邊,vis[i]表示i結點是否為白點,dis[i]表示i結點到起點s的最短距離

struct edge //

定義乙個結構體來存邊的資訊

}a[200001

];priority_queue

q; //

優先佇列

void add(int

from,int to,int dis) //

鏈式前向星存圖

intmain()

for(int i=1;i<=n;i++) dis[i]=inf,vis[i]=0;//

初始化

dis[s]=0

; q.push((edge)); //

敲黑板,難點重點!!!我們優先佇列定義的是edge型別的,所以我們放入乙個edge型別的集合,集合中的第乙個元素對應著結構體中的第乙個成員,後之同理

//換句話說,這步操作就是將乙個距離起點為0,編號為s的結點入隊

while(!q.empty())

); //將鬆弛過的點都入隊

} }} }

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

printf(

"%d

",dis[i]);

return0;

}

完結撒花qwq 雙倍經驗嘍

P4779 模板 單源最短路徑(標準版)

最短路 堆優化 dijkstra 優先佇列 複雜度 o eloge 洛谷4779 題目描述 給定乙個 n 個點,m 條有向邊的帶非負權圖,請你計算從 s 出發,到每個點的距離。資料保證能從 s 出發到任意點 輸入4 6 1 1 2 2 2 3 2 2 4 1 1 3 5 3 4 3 1 4 4 輸出...

P4779 模板 單源最短路徑(標準版)

題目入口 p4779 模板 單源最短路徑 標準版 使用 堆優化dijkstra求最短路 模版 使用模版前言 注意頂點數maxn的值 注意極大資料inf的值 include include include include include include include define maxn 3000...

P4779 模板 單源最短路徑(標準版)

單源最短路徑模板題,沒什麼好說的。然而本題卡普通spfa.昨天某位同學給我說了堆優化spfa.於是就拿來寫這道題,a了 堆優化思想就是把dis小的放在前邊,也許和slf優化差不多?然而感覺上比slf快很多 include include include include includeusing na...