题目描述

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

5
2 4 2 3 1

输出样例#1:

3

说明

样例1解释

游戏的流程如图所示。当进行完第 3 轮游戏后, 4 号玩家会听到 2 号玩家告诉他自

己的生日,所以答案为 3。当然,第 3 轮游戏后, 2 号玩家、 3 号玩家都能从自己的消息

来源得知自己的生日,同样符合游戏结束的条件。

对于 30%的数据, n ≤ 200;

对于 60%的数据, n ≤ 2500;

对于 100%的数据, n ≤ 200000。

思路:

  裸taijan;

来,上代码:

#include<cstdio>
#include<algorithm>#define maxn 200010using namespace std;struct node {int to,next;
};
struct node edge[maxn];int num_people,cur_1,num_edge=0,head[maxn];
int dfn[maxn],low[maxn],loop[maxn],stack[maxn];
int tarjan_dfn=0,stack_top=0,num_loop=0;bool if_in_stack[maxn];char word;inline void edge_add(int from,int to)
{num_edge++;edge[num_edge].to=to;edge[num_edge].next=head[from];head[from]=num_edge;
}inline void read_int(int &now_001)
{now_001=0;word=getchar();while(word<'0'||word>'9') word=getchar();while(word<='9'&&word>='0'){now_001=now_001*10+(int)(word-'0');word=getchar();}
}void tarjan_for_loop(int serc)
{tarjan_dfn++;dfn[serc]=tarjan_dfn;low[serc]=tarjan_dfn;stack[++stack_top]=serc;if_in_stack[serc]=true;for(int i=head[serc];i;i=edge[i].next){if(!dfn[edge[i].to]){tarjan_for_loop(edge[i].to);low[serc]=min(low[serc],low[edge[i].to]);}else if(if_in_stack[edge[i].to]) low[serc]=min(low[serc],low[edge[i].to]);}if(dfn[serc]==low[serc]){int cur_2=1;while(stack[stack_top]!=serc){cur_2++;if_in_stack[stack[stack_top]]=false;stack_top--;}if_in_stack[stack[stack_top]]=false;stack_top--;num_loop++;loop[num_loop]=cur_2;}
}int main()
{read_int(num_people);for(int i=1;i<=num_people;i++){read_int(cur_1);edge_add(i,cur_1);}for(int i=1;i<=num_people;i++) if(!dfn[i]) tarjan_for_loop(i);int ans=0x7fffffff;for(int i=1;i<=num_loop;i++) if(loop[i]>1) ans=min(ans,loop[i]);printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/IUUUUUUUskyyy/p/6066922.html

AC日记——信息传递 洛谷 P2661 (tarjan求环)相关推荐

  1. AC日记——积木大赛 洛谷 P1969

    题目描述 春春幼儿园举办了一年一度的"积木大赛".今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没 ...

  2. AC日记——友好城市 洛谷 P2782

    题目背景 无 题目描述 有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市.北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同.没对友好城市都向政府申请在河上 ...

  3. AC日记——任务查询系统 洛谷 P3168

    题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei ...

  4. AC日记——Power收集 洛谷 P3800

    Power收集 思路: 单调队列优化dp: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 4005 stru ...

  5. AC日记——集合位置 洛谷 P1491

    集合位置 思路: 次短路: 先走一遍最短路: 记录最短路径,然后依次删边走最短路: 最短的长度就是次短路: 来,上代码: #include <queue> #include <cma ...

  6. AC日记——背单词 洛谷 P2353

    背单词 思路: KMP+统计前缀和优化: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1000005 in ...

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

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

  8. 2019年东莞特长生 游戏(洛谷 P2661 信息传递)

    Description 某校科技节到了,有? 个同学(编号为1到?)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为? 的同学的信息传递对象是编号为??的同学. 游戏开始 ...

  9. tg2015 信息传递 (洛谷p2661)

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

最新文章

  1. 7个杀手级的开源监测工具
  2. 初学java---第二课《接收控制台(console)输入的方法》
  3. pandas清华镜像_一款可以像操作Excel一样玩Pandas的可视化神器来了!
  4. linux c文件操作,Linux C 文件的输入/输出操作
  5. 解决获取请求参数的乱码问题
  6. java oca_OCA第6部分中的Java难题
  7. ssh 登陆错误后禁止ip再次登陆_macOS破坏SSH默认规则,程序员无法登录Web服务器...
  8. TCP实现多线程下文件的上传
  9. 2 | Spatial-based GNN/convolution 概念
  10. java 改变文件路径_在C#中改变文件路径
  11. 新浪微博客户端(26)-添加转发评论工具条
  12. iOS 动态隐藏状态栏
  13. 《MonkeyRunner原理剖析》第九章-MonkeyImage实现原理 - 第七节 - 文件图片及子图处理类BufferedImageChimpImage...
  14. 软件研发过程客观体检指标
  15. 使用TortoiseGit 进行cherry pick 操作
  16. java 工具类_16 个有用的的Java工具类(小结)
  17. win8计算机管理员权限删除文件,如何解决 win8系统管理员权限删除文件夹访问被拒绝(3页)-原创力文档...
  18. 阅读Disentangling and Unifying Graph Convolutions for Skeleton-Based Action Recognition(CVPR2020)
  19. 毕业了,异地恋只能分手吗?
  20. ubuntu打不开硬盘

热门文章

  1. 浅谈TCP的窗口字段
  2. Spread for Windows Forms高级主题(5)---数据处理
  3. 修改项目名称后,部署到tomcat问题
  4. 2019年4月最新勒索病毒样本分析及数据恢复
  5. 内存对齐与ANSI C中struct型数据的内存布局 【转】
  6. [51单片机] HC-SR04超声波测距仪 基础代码
  7. 二十一世纪贫穷人的2008条语录
  8. 转 Debugging AutoCAD 2017 using Visual Studio 2015
  9. 递归和迭代的区别是什么,各有什么优缺点?
  10. JavaScript = TypeScript 类入门