題目描述
如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。
輸入輸出格式
輸入格式:
第一行包含三個整數n、m、s,分別表示點的個數、有向邊的個數、出發點的編號。
接下來m行每行包含三個整數fi、gi、wi,分別表示第i條有向邊的出發點、目標點和長度。
輸出格式:
一行,包含n個用空格分隔的整數,其中第i個整數表示從點s出發到點i的最短路徑長度(若s=i則最短路徑長度為0,若從點s無法到達點i,則最短路徑長度為2147483647)
輸入輸出樣例
輸入樣例#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
說明時空限制:1000ms,128m
資料規模:
對於20%的資料:n<=5,m<=15
對於40%的資料:n<=100,m<=10000
對於70%的資料:n<=1000,m<=100000
對於100%的資料:n<=10000,m<=500000
spfa做法
var
i,j,k,n,m,t:longint;
list,ans:array[0..10001] of longint;
next,x,y,z,p:array[0..500001] of longint;
f:array[0..500001] of boolean;
procedure
spfa;
var i,head,tail,l:longint;
begin
head:=0;
tail:=1;
while headdo
begin
inc(head);
f[p[head-1]]:=false;
l:=list[p[head]];
while l>0
dobegin
if ans[p[head]]+z[l]then
begin
ans[y[l]]:=ans[p[head]]+z[l];
ifnot f[y[l]] then
begin
inc(tail);
p[tail]:=y[l];
f[y[l]]:=true;
end;
end;
l:=next[l];
end;
end;
end;
begin
readln(n,m,k);
for i:=1
to m do
begin
readln(x[i],y[i],z[i]);
next[i]:=list[x[i]];
list[x[i]]:=i;
end;
for i:=1
to n do
ans[i]:=maxlongint;
fillchar(f,sizeof(f),false);
p[1]:=k;
f[k]:=true;
ans[k]:=0;
spfa;
for i:=1
to n do
write(ans[i],' ');
end.
P3371 模板 單源最短路徑
題目描述 如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。輸入輸出格式 輸入格式 第一行包含三個整數n m s,分別表示點的個數 有向邊的個數 出發點的編號。接下來m行每行包含三個整數fi gi wi,分別表示第i條有向邊的出發點 目標點和長度。輸出格式 一行,包含n個用空格分隔的整...
P3371 模板 單源最短路徑
如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。輸入格式 第一行包含三個整數n m s,分別表示點的個數 有向邊的個數 出發點的編號。接下來m行每行包含三個整數fi gi wi,分別表示第i條有向邊的出發點 目標點和長度。輸出格式 一行,包含n個用空格分隔的整數,其中第i個整數表示從...
洛谷 P3371 模板 單源最短路徑
題目大意 在乙個有向圖中,有m條邊 1 m 500000 n個點 1 n 10000 求點s到1 n個點的最短路徑長度,無最短路就輸出maxlongint。spfa 佇列優化 dis i 表示點s到i的最短路徑,一開始dis陣列為maxlongint。1.用佇列優化,就可以省略列舉每個點的時間,由o...