原題鏈結
若還未食用弱化版的同學請先做這個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完結撒花qwq 雙倍經驗嘍#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;
}
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...