有 n 个同学(编号为 1 到 n)正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为i 的同学的信息传递对象是编号为Ti 的同学。 游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息,但是每人只会把信息告诉一个人,即自己的信息传递对象)。当有人从别人口中得知自己的生日时,游戏结束。请问该游戏一共可以进行几轮?
------------------------------------------------------------------------------------分割线----------------------------------------------------------------------------------------
var
n,i,dep,ans,num:longint;
f,p,b:array[1..1000000] of longint;
procedure p1;
begin
assign(input,'message.in');
assign(output,'message.out');
reset(input);
rewrite(output);
end;
procedure p2;
begin
close(input);
close(output);
end;
procedure dfs(x,dep:longint);
begin
if not ((b[x]=0) or (b[x]=num)) then exit;
if f[x]=0 then begin
b[x]:=num;f[x]:=dep;dfs(p[x],dep+1);
end
else if dep-f[x]<ans then ans:=dep-f[x];
end;
begin
p1;
read(n);
for i:=1 to n do read(p[i]);
fillchar(f,sizeof(f),0);
fillchar(b,sizeof(b),0);
dep:=0;num:=0;ans:=maxlongint;
for i:=1 to n do
if b[i]=0 then begin
inc(num);dfs(i,dep);
end;
writeln(ans);
p2;
end.
Noip 2015 D1T2 信息传递(求最小环,dfs+时间戳)
最新推荐文章于 2020-06-18 16:55:07 发布