DFS cogs luogu 2105. [NOIP2015] 信息传递
★☆ 输入文件:2015message.in
输出文件:2015message.out
简单对比
时间限制:1 s
内存限制:256 MB
【题目描述】
有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
【提示】
游戏的流程如图所示。当进行完第 3 轮游戏后, 4 号玩家会听到 2 号玩家告诉他自
己的生日,所以答案为 3。当然,第 3 轮游戏后, 2 号玩家、 3 号玩家都能从自己的消息
来源得知自己的生日,同样符合游戏结束的条件。
对于 30%的数据, n ≤ 200;
对于 60%的数据, n ≤ 2500;
对于 100%的数据, n ≤ 200000。
STL过4点(真慢)
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<vector> 7 8 using namespace std; 9 const int N=200010; 10 11 vector<int>v[N]; 12 vector<int>VV[N]; 13 int nxt[N]; 14 15 inline int read() 16 { 17 int x=0; 18 char c=getchar(); 19 while(c<'0'||c>'9')c=getchar(); 20 while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); 21 return x; 22 } 23 24 int main() 25 { 26 freopen("2015message.in","r",stdin); 27 freopen("2015message.out","w",stdout); 28 29 int n=read(); 30 for(int i=1;i<=n;i++) 31 { 32 int x=read(); 33 nxt[i]=x; 34 v[i].push_back(i); 35 } 36 37 for(int i=1;;i++) 38 { 39 for(int j=1;j<=n;j++) 40 { 41 for(int k=0;k<v[j].size();k++) 42 { 43 if(v[j][k]==nxt[j]) 44 { 45 printf("%d",i); 46 return 0; 47 } 48 VV[nxt[j]].push_back(v[j][k]); 49 } 50 } 51 for(int j=1;j<=n;j++) 52 { 53 for(int k=0;k<VV[j].size();k++) 54 v[j].push_back(VV[j][k]); 55 VV[j].clear(); 56 } 57 } 58 59 return 0; 60 }
向图的最小环问题,深搜遍历解决(AC):
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cmath> 5 6 using namespace std; 7 8 9 int Roa[200001]; 10 int Jud[200001]; 11 int Hui[200001]; 12 int N,M=300000; 13 14 inline int read() 15 { 16 int x=0; 17 char c=getchar(); 18 while(c<'0'||c>'9')c=getchar(); 19 while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); 20 return x; 21 } 22 23 void Dfs(int k) 24 { 25 if(Hui[ Roa[k] ]||Jud[k])//be search again 26 { 27 if(Hui[ Roa[k] ]) 28 M=min(M,Hui[k]-Hui[ Roa[k] ]+1); 29 } 30 else 31 { 32 Jud[k]=1;//pan duan cong ci dian dao da de dian zhi qian shi fou dao guo 33 Hui[ Roa[k] ]=Hui[k]+1;//k->Roa[k]->Roa[Roa[k]]... 34 Dfs(Roa[k]); 35 Hui[ Roa[k] ]=0;//回溯 36 } 37 } 38 39 int main() 40 { 41 freopen("2015message.in","r",stdin); 42 freopen("2015message.out","w",stdout); 43 N=read(); 44 for(int i=1;i<=N;i++) 45 { 46 Roa[i]=read();//a->Roa[a] 47 Jud[i]=0;//pan duan 48 Hui[i]=0; 49 } 50 for(int i=1;i<=N;i++) 51 if(!Jud[i])//had not found himself,可无,没用 52 Dfs(i); 53 54 printf("%d",M); 55 56 return 0; 57 }