【NOIP2015提高组Day1】信息传递

摘要:
在游戏中,每个人都有一个固定的信息传递对象,其中,编号为i的学生的信息传递目标是编号为Ti的学生。随后,在每一轮中,每个人均会将自己当前的生日信息同时告知各自的信息传输对象。当有人从别人那里得知自己的生日时,游戏就结束了。这场比赛可以打多少轮?输入文件名为message。第一行包含一个正整数n,表示n个人。第二行包含n个正整数T1、T2、,。。。用空格隔开。数据保证游戏将结束。输出文件名为message.out。一个裸的强连接组件!!

【问题描述】

有n个同学(编号为1到n)正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti的同学。游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息,但是每人只会把信息告诉一个人,即自己的信息传递对象)。当有人从别人口中得知自己的生日时,游戏结束。请问该游戏一共可以进行几轮?   

【输入格式】

 输入文件名为message.in。 输入共2行。  第 1 行包含 1 个正整数n,表示n个人。  第 2 行包含n个用空格隔开的正整数T1,T2,… ,Tn,其中第Ti个整数表示编号为i 的同学的信息传递对象是编号为Ti的同学,Ti≤n且Ti≠i。  数据保证游戏一定会结束。   

【输出格式】

输出文件名为message.out。  输出共1行,包含1个整数,表示游戏一共可以进行多少轮。

【题解】

 一个赤裸裸的强连通分量啊!!

【代码】

type
  arr=record
      y,next:longint;
      end;
var
  e:array [0..200001] of arr;
  n,ans,tail,en,dn,bn:longint;
  v:array [0..200001] of boolean;
  f,ls,a,low,dfn:array [0..200001] of longint;
procedure add(o,p:longint);
begin
  inc(en);
  with e[en] do
    begin
      y:=p;
      next:=ls[o];
      ls[o]:=en;
    end;
end;

function min(o,p:longint):longint;
begin
  if o<p then exit(o);
  exit(p);
end;

procedure dfs(x:longint);
var
  i,j,sz:longint;
begin
  inc(tail);
  f[tail]:=x;
  v[x]:=true;
  inc(dn);
  low[x]:=dn; dfn[x]:=dn;
  i:=ls[x];
  while i<>0 do
    with e[i] do
      begin
        if dfn[y]=0 then
          begin
            dfs(y);
            low[x]:=min(low[x],low[y]);
          end else
          if v[y] then
            low[x]:=min(low[x],dfn[y]);
        i:=next;
      end;
  if low[x]=dfn[x] then
    begin
      inc(bn);
      sz:=0;
      repeat
        inc(sz);
        j:=f[tail];
        dec(tail);
        v[j]:=false;
        a[j]:=bn;
      until j=x;
      if sz>1 then ans:=min(ans,sz);
    end;
end;

procedure tarjan;
var
  i:longint;
begin
  ans:=maxlongint;
  fillchar(dfn,sizeof(dfn),0);
  fillchar(low,sizeof(low),0);
  bn:=0; dn:=0; tail:=0;
  for i:=1 to n do
    if dfn[i]=0 then
      dfs(i);
end;

procedure init;
var
  i,y:longint;
begin
  readln(n);
  for i:=1 to n do
    begin
      read(y);
      add(i,y);
    end;
end;

begin
  assign(input,'message.in');
  assign(output,'message.out');
  reset(input);
  rewrite(output);
  init;
  tarjan;
  write(ans);
  close(input);
  close(output);
end.

免责声明:文章转载自《【NOIP2015提高组Day1】信息传递》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇设计模式(一)单例模式:2-懒汉模式(Lazy)打印 PRINT下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

ubuntu用命令连接无线网络

拔下USB网卡并重新插入。无法使用上述步骤成功连接AP。可以使用以下步骤成功连接AP。参考:1.打开无线网卡iwconfigwlan0txpoweron2.列出无线网络iwlistwlan0scan3.如果要连接到网络MyHome,请输入命令iwconfigwlan 0sessiond“MyHome”。如果网络已加密,密码为0123456789,请输入命令i...

mysql之排序查询

高级文章目录3:排序查询功能:1.按单个字段排序案例1:查询员工信息,要求工资从高到低排序2.为排序添加筛选条件案例1:部门编号˃=90的员工信息,按员工编号降序排序案例2:部门编号˃=90的人员信息,按输入时间排序。按表达式排序案例1:按年薪显示员工信息和年薪4按别名排序案例1按年薪升序查询员工信息5.按函数(长度)排序案例1查询员工姓名并按姓名长度减少...

关于WINFORM中输入法的设置

关于WINFORM(转移到)John Suna的专栏开发中输入方法的设置,它碰巧遇到了这种问题。网络真的很好:)这是文本集。感谢作者的辛勤工作给您带来的便利。在WINFORM中,我们经常遇到这样的问题:文本输入框中的输入法被禁用或总是更改为全宽输入法。查阅相关数据后,总结如下:(1)Control.ImeMode属性:获取或设置控件的输入方法编辑器模式。此模...

【转】 中兴OLT-C300常用命令

在当前的C220版本中,ONU类型名称在GPON和EPON中应该是唯一的。这里我们使用“ZTEG-F620”。ZXAN#ponZXAN#onu-typegponZTEG-F620描述4ETH,2POTSZXAN#onu-ifZTEG-F620eth_0/1-4ZXAN#onon-ifZTEG-F620pots_0/1-2ZXAN#on u type attr...

PostgreSQL 语法

Psql(11.12)输入“help”以获取帮助信息。postgres=#help输入命令行工具,…])][*|表达式[[AS]输出_名称][,...

Vue中在移动端如何判断设备是安卓还是ios

u、 匹配(/(i[^;]+;(U;)?CPU+MacOSX/);如果(isiOS){return“ios”;}否则{return“android”;}},...