題目描述
如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。
輸入輸出格式
輸入格式:
第一行包含三個整數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
o(ke)
spfa,求出每個點到其他點的最短距離,但要注意是單向圖。
const
maxp=15000;
var p,c,s:longint;
a,b:array[0..maxp,0..maxp]of longint;
d,m,dist:array[0..maxp]of longint;
v:array[0..maxp]of boolean;
head,tail:longint;
procedure
init;
var i,x,y,z:longint;
begin
read(p,c,s);
for i:=1
to c do
begin
readln(x,y,z);
inc(b[x,0]);b[x,b[x,0]]:=y;a[x,y]:=z;
end;
end;
procedure
spfa
(s:longint);
var i,j,now:longint;
begin
fillchar(d,sizeof(d),0);
fillchar(v,sizeof(v),false);
for j:=1
to p do dist[j]:=maxlongint;
dist[s]:=0;v[s]:=true;d[1]:=s;
head:=1;tail:=1;
while head<=tail do
begin
now:=d[head];
for i:=1
to b[now,0] do
if dist[b[now,i]]>dist[now]+a[now,b[now,i]] then
begin
dist[b[now,i]]:=dist[now]+a[now,b[now,i]];
ifnot v[b[now,i]] then
begin
inc(m[b[now,i]]);
inc(tail);
d[tail]:=b[now,i];
v[b[now,i]]:=true;
end;
end;
v[now]:=false;
inc(head);
end;
end;
var i:longint;
begin
init;
spfa(s);
for i:=1
to p do
write(dist[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...