P3371 模板 單源最短路徑

2021-07-28 02:34:05 字數 1787 閱讀 5584

題目描述

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

輸入輸出格式

輸入格式:

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