题目大意
给一个无向图(点数1<=n<=100000 ),求从起点到那一个点的最短路最长,并输出路径长度。
分析
就是一个赤裸裸的spfa吗!
代码
const
maxe=100000;
maxv=2000000;
type
arr=record
x,y,w,next:longint;
end;
var
n,m,s,q:longint;
ls:array[1..maxe] of longint;
a:array[1..maxv] of arr;
f:array[1..maxe] of longint;
v:array[1..maxe] of longint;
d:array[1..maxe] of longint;
i,j,k:longint;
ans:longint;
procedure spfa;
var
i,j,k:longint;
head,tail:longint;
begin
fillchar(f,sizeof(f),$7f);
head:=0;
tail:=1;
v[s]:=1;
d[1]:=s;
f[s]:=1;
repeat
head:=head mod maxe+1;
j:=ls[d[head]];
while j<>0 do
begin
with a[j] do
begin
if f[x]+w<f[y]
then
begin
f[y]:=f[x]+w;
if v[y]=0
then
begin
tail:=tail mod maxe+1;
d[tail]:=y;
v[y]:=1;
end;
end;
j:=next;
end;
end;
v[d[head]]:=0;
until head=tail;
end;
begin
assign(input,'spfa.in');
assign(output,'spfa.out');
rewrite(output);
reset(input);
readln(n,m,s);
readln(q);
fillchar(ls,sizeof(ls),0);
for i:=1 to m do
begin
with a[i*2-1] do
begin
readln(x,y);
w:=1;
next:=ls[x];
ls[x]:=i*2-1;
end;
a[i*2].x:=a[i*2-1].y;
a[i*2].y:=a[i*2-1].x;
a[i*2].w:=1;
a[i*2].next:=ls[a[i*2].x];
ls[a[i*2].x]:=i*2;
end;
spfa;
ans:=0;
for i:=1 to n do
if f[i]>ans then ans:=f[i];
write(ans+q);
close(input);
close(output);
end.