Noip 2015 D1T2 信息传递(求最小环,dfs+时间戳)

有 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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值