题意/Description:
小Q非常喜欢在自己的国家旅行。小Q所在的国家有N座城市,分别编号为1~n,小Q所在的城市编号为1。小Q现在想知道从他所在的城市出发,到其他N-1个城市的最短路程分别是多少?
读入/Input:
第一行两个整数N,M(1<=n<=1000,1<=M<=100000),分别表示小Q所在的国家有N座城市以及城市间有M条单向道路。
接下来M行,每行三个整数x,y,len(1<=x,y<=n,1<=len<=100000)表示从城市x去到城市y需要走len这么多路程。
输入可能存在重边
输出/Output:
一共N-1行,每行一个整数,第i个整数表示小Q从城市1到城市(i+1)的最短路程。如果不能到达输出-1
题解/solution:
明显的最短路,SPFA秒掉。注意是单向。
代码/Code:
const
maxE=100001;
maxV=400001;
type
arr=record
x,y,w,next:int64;
end;
var
n,m,nm:longint;
a:array [0..maxV] of arr;
ls:array [0..maxE] of longint;
list,b,d,v:array [0..maxE] of int64;
ans,max:int64;
procedure spfa;
var
i,j,k,h,t:longint;
begin
fillchar(d,sizeof(d),63);
max:=d[1]; h:=0; t:=1;
v[1]:=1; list[1]:=1; d[1]:=0;
repeat
h:=h+1;
j:=ls[list[h]];
while j<>0 do
begin
with a[j] do
begin
if d[x]+w<d[y] then
begin
d[y]:=d[x]+w;
if v[y]=0 then
begin
t:=t+1;
list[t]:=y;
v[y]:=1;
end;
end;
j:=next;
end;
end;
v[list[h]]:=0;
until h=t;
end;
procedure init1;
begin
fillchar(ls,sizeof(ls),0);
fillchar(list,sizeof(list),0);
fillchar(b,sizeof(b),0);
fillchar(a,sizeof(a),0);
fillchar(v,sizeof(v),0);
end;
procedure init2;
var
i,t,k:longint;
begin
readln(n,m);
for i:=1 to m do
begin
t:=i*2; k:=t-1;
with a[k] do
begin
readln(x,y,w);
next:=ls[x];
ls[x]:=k;
end;
end;
m:=m*2;
end;
procedure print;
var
i:longint;
begin
for i:=2 to n do
writeln(d[i]);
end;
procedure init_main;
var
i:longint;
begin
init1;
init2;
spfa;
print;
end;
begin
init_main;
end.