背景 Background
JSOI2012春季函授A层次考试题
描述 Description
顾神牛到达目的地后,打算找个旅馆住下好好享受一下他愉快的假期。该地有n个风景区,每个风景区中心都有一个旅馆,其中m对风景区是可以互相到达的,且距离为1。顾神牛希望他挑选的旅馆和离旅馆最远的风景区之间的距离尽量最短(风景区、旅馆本身的大小忽略不计,看作同一个点)。
输入格式 Input Format
第一行两个整数n m,表示总共n个风景区和m对关系。
以下m行,每行两个整数x y,表示第x个风景区和第y个风景区可以互相到达。
输出格式 Output Format
一个整数,表示旅馆和离旅馆最远的风景区的距离,该距离要求是最短的。
样例输入 Sample Input
3 2
1 2
1 3
样例输出 Sample Output
1
时间限制 Time Limitation
各个测试点1s
【数据规模】
n<=1000
m<=15000
注释 Hint
JSOI2012春季函授A层次考试题
最短路径图应用。
var
v:array [0..1001] of boolean;
g,e:array [0..1001] of longint;
d:array [0..1001,0..1001] of longint;
t,s,next:array [0..100001] of longint;
a,b,c,n,m,j,k,r,i,l,now,ans,u:longint;
begin
readln(n,m);
r:=0;
for i:=1 to m do
begin
readln(a,b);
inc(r);t[r]:=b;
if g[a]=0 then
begin
g[a]:=r;e[a]:=r;
end
else
begin
next[e[a]]:=r;e[a]:=r;
end;
inc(r);t[r]:=a;
if g[b]=0 then
begin
g[b]:=r;e[b]:=r;
end
else
begin
next[e[b]]:=r;e[b]:=r;
end;
end;
ans:=maxlongint;
for i:=1 to n do
begin
for j:=1 to n do
d[i][j]:=maxlongint shr 1;
d[i][i]:=0;
fillchar(v,sizeof(v),false);
l:=1;r:=1;s[l]:=i;v[i]:=true;
while l<=r do
begin
u:=g[s[l]];
while u<>0 do
begin
if d[i][t[u]]>d[i][s[l]]+1 then
begin
d[i][t[u]]:=d[i][s[l]]+1;
if not v[t[u]] then
begin
v[t[u]]:=true;
inc(r);
s[r]:=t[u];
end;
end;
u:=next[u];
end;
v[s[l]]:=false;
inc(l);
end;
now:=0;
for j:=1 to n do
if d[i][j]>now then now:=d[i][j];
if now<ans then ans:=now;
end;
writeln(ans);
end.