P2661 信息传递
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2661 信息传递相关的知识,希望对你有一定的参考价值。
题目描述
有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 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 int n,nex[200010],r[200010],v[200010]={0}; 6 int main() 7 { 8 int i,j,ans=2000010,x; 9 cin>>n; 10 for(i=1;i<=n;i++) cin>>nex[i]; //输入下一个 11 for(j=1;j<=n;j++) 12 { 13 x=j; //x=当前的数 14 for(i=1;i<=n+1;i++) 15 { 16 r[i]=x;//赋值为下一步要走的点 17 if(v[x]<j&&v[x]!=0) //如果这个点曾经已经被走过,并且已经赋上了值,就不再走了; 18 { 19 x=-1; 20 break; 21 } 22 v[x]=j;//用来判断以前走没走 23 x=nex[x];//走下一个点 24 } 25 if(x==-1) continue; 26 for(i=n;i>=1;i--)//1到n中有多少环 27 { 28 if(r[i]==r[n+1]) 29 { 30 if(n-i+1<ans) ans=n-i+1;//找环少的 31 break; 32 } 33 } 34 } 35 cout<<ans;//输出 36 return 0; 37 }
以上是关于P2661 信息传递的主要内容,如果未能解决你的问题,请参考以下文章