P3371 模板 單源最短路徑

2021-08-13 02:46:16 字數 1728 閱讀 8742

題目描述

如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。

輸入輸出格式

輸入格式:

第一行包含三個整數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...