洛谷 2661 信息传递(暴力、tarjan)
来源:互联网 发布:php 判断数据类型 编辑:程序博客网 时间:2024/06/09 06:18
题目描述
有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。
1.暴力
从每个入度为0的点开始跑,找最小环,因为题目的特殊性(每个点只有一个出度),可以保证最多每个点都访问一遍。
#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>using namespace std;int n,ans=1e9+7;int rd[200010],used[200010],per[200010];int To[200010];void Done(int s){ int k=s; used[s]=k; while(To[s]) { if(!used[To[s]]) per[To[s]]=per[s]+1,used[To[s]]=k; else { if(used[To[s]]==k) ans=min(ans,per[s]-per[To[s]]+1); break; } s=To[s]; }}int main(){ scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d",&To[i]); ++rd[To[i]]; } for(int i=1;i<=n;++i) if(!rd[i]) Done(i); printf("%d",ans); return 0;}
2.修改的tarjan?
改了改tarjan。
#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>using namespace std;int N,top,ans=1e9+7,cnt;int Dfn[200010],Low[200010],To[200010];int Stack[200010],Instack[200010],Done[200010];void tarjan(int n){ Dfn[n]=Low[n]=++cnt; Stack[++top]=n; Instack[n]=1; Done[n]=1; if(To[n]) { if(!Dfn[To[n]]) { tarjan(To[n]), Low[n]=min(Low[n],Low[To[n]]); } else if(Instack[To[n]]) Low[n]=min(Low[n],Dfn[To[n]]); } if(Dfn[n]==Low[n]) { int k=top,j; do { j=Stack[top]; top--; Instack[j]=0; }while(j!=n); if(k!=top+1) ans=min(ans,k-top); }}int main(){ scanf("%d",&N); for(int i=1;i<=N;++i) scanf("%d",&To[i]); for(int i=1;i<=N;++i) if(!Done[i]) tarjan(i); printf("%d",ans); return 0; } //不会有大环套小环的情况,可以用tarjan求。
阅读全文
0 0
- 洛谷 2661 信息传递(暴力、tarjan)
- 【NOIP2015】洛谷P2661 信息传递(tarjan)
- 信息传递(tarjan算法)
- 【Tarjan】NOIP2015D1T2[信息传递]题解
- NOIP2015信息传递 强连通分量 tarjan
- 【Tarjan】UOJ#146 【NOIP2015】信息传递
- 洛谷2661 信息传递
- 洛谷Oj-信息传递-拓扑排序+DFS/Tarjan强连通分量
- 【NOIP 2015 Day1 T2】信息传递(dfs || 拓扑排序 || Tarjan)
- NOIP2015信息传递(洛谷2661)
- 2015 NOIP day2 t2 信息传递 (tarjan 连通图)
- 【题解】NOIP 2015 信息传递(tarjan 强连通分量)
- Noip提高组2015 Day1 T2 信息传递 tarjan
- 【NOIP2015】洛谷2661 信息传递
- HDU-5961 传递(暴力)
- 洛谷P2661 信息传递 (NOIp2015)
- 洛谷P2661 信息传递
- 洛谷 P2661 信息传递
- Leetcode 7 Reverse Integer
- [数学理论]范数
- 方法调用实参时,发生了什么?
- Lauren与密码学9,数字签名
- 将eclipse,虚拟机,mysql安装到移动硬盘上,亲测
- 洛谷 2661 信息传递(暴力、tarjan)
- [Linux] 双系统情况下,开机出现unknown filessystem
- Java学习经历回顾----泛型
- 浅谈嵌入式MCU开发中的三个常见误区
- 关于程序员的59条搞笑但却真实无比的编程语录
- 不能对非静态字段/方法进行静态引用
- HashSet 的使用 自定义hashCode和equals
- Python中摘要算法MD5,SHA1讲解
- JavaBean