洛谷 P3371 模板 單源最短路徑

2021-07-28 02:37:13 字數 1353 閱讀 7922

題目大意:

在乙個有向圖中,有m條邊(1<=m<=500000),n個點(1<=n<=10000),求點s到1~n個點的最短路徑長度,無最短路就輸出maxlongint。

spfa+佇列優化:

dis[i]表示點s到i的最短路徑,一開始dis陣列為maxlongint。

1.用佇列優化,就可以省略列舉每個點的時間,由o(m^2)變成了o(m)。

2.跑一波spfa,然後輸出就好了。

var

list,s,t,w,next,p:array [0..500001] of longint;

dis:array [0..10001] of longint;

v:array [0..10001] of boolean;

x,i,j,n,m,q:longint;

procedure

spfa;

var head,tail,i:longint;

begin

head:=0;

tail:=1;

dis[q]:=0;

v[q]:=true;

p[1]:=q;

while headdo

begin

inc(head);

i:=list[p[head]];

while i>0

dobegin

if dis[s[i]]+w[i]then

begin

dis[t[i]]:=dis[s[i]]+w[i];

if v[t[i]]=false

then

begin

v[t[i]]:=true;

inc(tail);

p[tail]:=t[i];

end;

end;

i:=next[i];

end;

v[p[head]]:=false;

end;

end;

begin

readln(n,m,q);

for i:=1

to m do

begin

readln(s[i],t[i],w[i]);

next[i]:=list[s[i]];

list[s[i]]:=i;

end;

for i:=1

to n do

begin

dis[i]:=maxlongint;

v[i]:=false;

end;

spfa;

for i:=1

to n do

write(dis[i],' ');

end.

洛谷P3371 模板 單源最短路徑

p3371 模板 單源最短路徑 看了b站上的spfa演算法講解,重新敲了一遍這個題,學習spfa演算法。題意 給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。spfa演算法是對bellman ford演算法的優化。後者複雜度為o nm 每一輪都對所有邊確定是否更新。前者將點加入佇列中,用b...

洛谷 P3371 模板 單源最短路徑

如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。第一行包含三個整數n m s,分別表示點的個數 有向邊的個數 出發點的編號。接下來m行每行包含三個整數fi gi wi,分別表示第i條有向邊的出發點 目標點和長度。一行,包含n個用空格分隔的整數,其中第i個整數表示從點s出發到點i的最短...

洛谷 P3371 模板 單源最短路徑

如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。輸入格式 第一行包含三個整數n m s 分別表示點的個數 有向邊的個數 出發點的編號。接下來 m 行每行包含三個整數fi gi wi,分別表示第 i 條有向邊的出發點 目標點和長度。輸出格式 一行,包含 n個用空格分隔的整數,其中第 i...