题目背景

NOIP2015 提高组 Day1 T2

题目描述

有 n 个同学(编号为1到n)正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti 的同学。

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

输入格式

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

输出格式

输出共 1 行,包含  1 个整数,表示游戏一共可以进行多少轮。

样例数据 1

输入


2 4 2 3 1

输出

3

备注

【样例1说明】

游戏的流程如图所示。当进行完第 3 轮游戏后,4 号玩家会听到 2 号玩家告诉他自己的生日,所以答案为 3 。当然,第 3 轮游戏后, 2 号玩家、3 号玩家都能从自己的消息来源得知自己的生日,同样符合游戏结束的条件。

【数据范围】 
对于 30% 的数据,n≤200;
对于 60% 的数据,n≤2500;
对于 100% 的数据,n≤200000。

解析:

稍微分析一下可知是求一个有向且无自环的图的最小环,但是明显不能用Floyd求最小环,所以考虑使用Tarjan求强连通,由于边数等于点数,所以每个强连通分量内有且只有一个环,所以求最小的强连通分量就是求最小环。

代码:

#include <bits/stdc++.h>
using namespace std;const int Max=200005;
int n,m,size,Index,cnt,tot,ans=1e9;
int num[Max],low[Max],sum[Max],p[Max<<1],vis[Max],first[Max];
struct shu{int to,next;};
shu edge[Max];inline int get_int()
{int x=0,f=1;char c;for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());if(c=='-') f=-1,c=getchar();for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';return x*f;
}inline void build(int x,int y)
{edge[++size].next=first[x];first[x]=size;edge[size].to=y;
}inline void tarjan(int point)
{num[point]=low[point]=++Index;p[++tot]=point,vis[point]=1;for(int u=first[point];u;u=edge[u].next){int to=edge[u].to;if(!num[to]) tarjan(to),low[point]=min(low[point],low[to]);else if(vis[to]) low[point]=min(low[point],num[to]);}if(low[point]==num[point]){cnt++;while(1){int x=p[tot--];sum[cnt]++;vis[x]=0;if(x==point) break;}}
}int main()
{n=get_int();for(int i=1;i<=n;i++) build(i,get_int());for(int i=1;i<=n;i++) if(!num[i]) tarjan(i);for(int i=1;i<=cnt;i++) if(sum[i]!=1) ans=min(ans,sum[i]);cout<<ans<<"\n";return 0;
}

【NOIP2015提高组】信息传递相关推荐

  1. NOIP2015提高组 信息传递(图论)

    [问题描述] 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后 ...

  2. P2678 [NOIP2015 提高组] 跳石头

    P2678 [NOIP2015 提高组] 跳石头 题目背景 一年一度的"跳石头"比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选 ...

  3. 信息学奥赛一本通 1890:【15NOIP提高组】跳石头 | 洛谷 P2678 [NOIP2015 提高组] 跳石头

    [题目链接] ybt 1890:[15NOIP提高组]跳石头 洛谷 P2678 [NOIP2015 提高组] 跳石头 ybt 1247:河中跳房子 OpenJudge NOI 1.11 10:河中跳房 ...

  4. 洛谷-神奇的幻方-NOIP2015提高组复赛

    题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,--,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...

  5. P2615 [NOIP2015 提高组] 神奇的幻方

    题目描述 幻方是一种很神奇的 N\times NN×N 矩阵:它由数字 1,2,3,\cdots \cdots ,N \times N1,2,3,⋯⋯,N×N 构成,且每行.每列及两条对角线上的数字之 ...

  6. [NOIP2015 提高组] 神奇的幻方 ——C++

    [NOIP2015 提高组] 神奇的幻方 题目描述 幻方是一种很神奇的 N∗NN*NN∗N 矩阵:它由数字 1,2,3,⋯⋯ ,N×N1,2,3,\cdots \cdots ,N \times N1, ...

  7. [NOIP2015] 提高组 洛谷P2661 信息传递

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  8. 信息传递(NOIP2015提高组Day1T2)

    [题目描述] 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后 ...

  9. [NOIP2015 提高组] 神奇的幻方

    题目描述 幻方是一种很神奇的 N*NN∗N 矩阵:它由数字 1,2,3,\cdots \cdots ,N \times N1,2,3,⋯⋯,N×N 构成,且每行.每列及两条对角线上的数字之和都相同. ...

最新文章

  1. Glide 的基本使用
  2. 2021年春季学期-信号与系统-第二次作业参考答案-第一小题
  3. torch The “freeze_support()” line can be omitted if the programis not going to be frozen to produce
  4. Discuz!NT控件剖析 之 Button [原创: 附源码]
  5. Centos7 安装 Elasticsearch7.10(不错可以试试)
  6. 合并多个wordpress到一个
  7. crontab 每分钟一次_Celery实现定时任务crontab
  8. AS5047P磁编码器ESP32驱动程序、硬件电路设计、SPI通信时序、逻辑波形分析、注意事项
  9. c语言实训项目设计设计游戏,C语言实训三贪吃蛇游戏设计.doc
  10. QT5.9的安装和配置
  11. 【ipone开发学习】-2、利用现有资源第二步 硬盘安装Snow LeopardXcode
  12. 苏雅欣课后作业四 个人总结
  13. 理想浪漫主义色彩的句子
  14. 2020年了,BAT都组建了哪些科技实验室?
  15. 面对困难,你可以等死,也可以马上动手解决问题,解决完一个,就再解决一个,然后就可以回家了。...
  16. java秋招面试攻略
  17. 小说阅读器,伪装360加速器
  18. 12 .IIC协议(51单片机和C语言模拟I2C协议)
  19. LA/NMP架构的介绍
  20. [bzoj1455]罗马游戏

热门文章

  1. python_matplotlib改变横坐标和纵坐标上的刻度(ticks)
  2. 【Oracle数据库基础学习】
  3. 显示器点距 测试软件,显示器各尺寸点距一览
  4. python金融分析-计算对数收益率及其波动率并画图
  5. Oracle Flashback之Flashback table和flashback drop
  6. python的scapy_python scapy网络嗅探
  7. Integer 用法
  8. 图像特征提取算法:加速鲁棒特征SURF
  9. 9、MyBatis的动态SQL
  10. long(Long)与int(Integer)四种类型之间互相转换的方法分享