題目大意:
在乙個有向圖中,有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...