AC日记——信息传递 洛谷 P2661 (tarjan求环)
题目描述
有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 个整数,表示游戏一共可以进行多少轮。
输入输出样例
5 2 4 2 3 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求环)相关推荐
- AC日记——积木大赛 洛谷 P1969
题目描述 春春幼儿园举办了一年一度的"积木大赛".今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没 ...
- AC日记——友好城市 洛谷 P2782
题目背景 无 题目描述 有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市.北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同.没对友好城市都向政府申请在河上 ...
- AC日记——任务查询系统 洛谷 P3168
题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei ...
- AC日记——Power收集 洛谷 P3800
Power收集 思路: 单调队列优化dp: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 4005 stru ...
- AC日记——集合位置 洛谷 P1491
集合位置 思路: 次短路: 先走一遍最短路: 记录最短路径,然后依次删边走最短路: 最短的长度就是次短路: 来,上代码: #include <queue> #include <cma ...
- AC日记——背单词 洛谷 P2353
背单词 思路: KMP+统计前缀和优化: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1000005 in ...
- [NOIP2015] 提高组 洛谷P2661 信息传递
题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...
- 2019年东莞特长生 游戏(洛谷 P2661 信息传递)
Description 某校科技节到了,有? 个同学(编号为1到?)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为? 的同学的信息传递对象是编号为??的同学. 游戏开始 ...
- tg2015 信息传递 (洛谷p2661)
题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...
最新文章
- 7个杀手级的开源监测工具
- 初学java---第二课《接收控制台(console)输入的方法》
- pandas清华镜像_一款可以像操作Excel一样玩Pandas的可视化神器来了!
- linux c文件操作,Linux C 文件的输入/输出操作
- 解决获取请求参数的乱码问题
- java oca_OCA第6部分中的Java难题
- ssh 登陆错误后禁止ip再次登陆_macOS破坏SSH默认规则,程序员无法登录Web服务器...
- TCP实现多线程下文件的上传
- 2 | Spatial-based GNN/convolution 概念
- java 改变文件路径_在C#中改变文件路径
- 新浪微博客户端(26)-添加转发评论工具条
- iOS 动态隐藏状态栏
- 《MonkeyRunner原理剖析》第九章-MonkeyImage实现原理 - 第七节 - 文件图片及子图处理类BufferedImageChimpImage...
- 软件研发过程客观体检指标
- 使用TortoiseGit 进行cherry pick 操作
- java 工具类_16 个有用的的Java工具类(小结)
- win8计算机管理员权限删除文件,如何解决 win8系统管理员权限删除文件夹访问被拒绝(3页)-原创力文档...
- 阅读Disentangling and Unifying Graph Convolutions for Skeleton-Based Action Recognition(CVPR2020)
- 毕业了,异地恋只能分手吗?
- ubuntu打不开硬盘