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

2021-09-25 03:22:09 字數 1852 閱讀 6635

題目背景

2018 年 7 月 19 日,某位同學在 noi day 1 t1 歸程 一題裡非常熟練地使用了乙個廣為人知的演算法求最短路。

然後呢?

100 \rightarrow 60100→60;

ag \rightarrow cuag→cu;

最終,他因此沒能與理想的大學達成契約。

小 f 衷心祝願大家不再重蹈覆轍。

題目描述

給定乙個 nn 個點,mm 條有向邊的帶非負權圖,請你計算從 ss 出發,到每個點的距離。

資料保證你能從 ss 出發到任意點。

輸入格式

第一行為三個正整數 n, m, sn,m,s。 第二行起 mm 行,每行三個非負整數 u_i, v_i, w_iui​,vi​,wi​,表示從 u_iui​ 到 v_ivi​有一條權值為 w_iwi​ 的邊。

輸出格式

輸出一行 nn 個空格分隔的非負整數,表示 ss 到每個點的距離。

輸入輸出樣例

輸入 #1複製

4 6 1

1 2 2

2 3 2

2 4 1

1 3 5

3 4 3

1 4 4

輸出 #1複製

0 2 4 3

說明/提示

樣例解釋請參考 資料隨機的模板題。

1 \leq n \leq 1000001≤n≤100000;

1 \leq m \leq 2000001≤m≤200000;

s = 1s=1;

1 \leq u_i, v_i\leq n1≤ui​,vi​≤n;

0 \leq w_i \leq 10 ^ 90≤wi​≤109,

0 \leq \sum w_i \leq 10 ^ 90≤∑wi​≤109。

本題資料可能會持續更新,但不會重測,望周知。

2018.09.04 資料更新 from @zzq

使用了堆優化的dijkstra。

時間複雜度為o(m\ log\ n)o(m log n)。

if (dis[u]!=d) continue

每次鬆弛操作後,要刪除堆中原有的節點,這樣很不方便,所以就加上這一句話判斷是否被刪除過。

#include#include#include#includeusing namespace std;

const int n=100010,m=200020;

int tot=0;

int n,m,s;

int head[n];

long long d[n];

bool v[n];

priority_queue> q;

inline int read1()

while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();

return ret*f;

}inline long long read2()

while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();

return ret*f;

}struct edgee[m];

void add(int x,int y,long long z)

void dijkstra()

d[s]=0;

q.push(make_pair(0,1));

while(!q.empty())}}

}int main()

dijkstra();

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

printf("\n");

return 0;

}

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

題目鏈結 給定乙個 n 個點,m 條有向邊的帶非負權圖,請你計算從 s 出發,到每個點的距離。資料保證你能從 s 出發到任意點。第一行為三個正整數 n,m,s。第二行起 m 行,每行三個非負整數 ui,vi,wi,表示從 ui 到 vi 有一條權值為 wi 的有向邊。輸出一行 n 個空格分隔的非負整...

單源最短路徑(標準版)

題目描述 傳送門與弱化版的單圈最短路徑題 即p3371 的題目比較,主要有兩個不同點 其他的基本不變 1.此題中說明了所給的測試資料能保證起始點訪問到所有的點 2.很明顯,這個題的時間限制更加嚴格 題解 因此要解決此題,我們可以再p3371的基礎上 鏈結 進行修改 優化,即可達到此題的要求。針對於不...

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 輸出...