★☆ 输入文件: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。
在此键入。
Pascal C C++
一开始用vector居然还能搞四十分
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 #include<map>
6 #include<stack>
7 #include<vector>
8 #include<cstdlib>
9 #include<algorithm>
10 using namespace std;
11 const int MAXN=200001;
12 int n;
13 struct node
14 {
15 vector<int>v;
16 int num,to,but;
17 }a[MAXN];
18 int main()
19 {
20 freopen("2015message.in","r",stdin);
21 freopen("2015message.out","w",stdout);
22 scanf("%d",&n);
23 for(int i=1;i<=n;i++)
24 scanf("%d",&a[i].to),a[i].num=0,a[i].v.push_back(i);
25
26 int ans=0;
27 while(1)
28 {
29 ans++;
30 for(int i=1;i<=n;i++)
31 {
32 for(int j=0;j<=a[i].num-a[i].but;j++)// i 把知道的所有人的信息跟to说
33 {
34 //a[a[i].to].num++;
35 vector<int>::iterator s=find(a[i].v.begin(),a[i].v.end(),a[i].v[j]);
36 if(s!=a[i].v.end())
37 {
38 a[a[i].to].v.push_back(a[i].v[j]);
39 a[a[i].to].num++;
40 a[a[i].to].but++;
41 }
42
43 }
44 //print(i);
45 for(int j=1;j<=a[a[i].to].num;j++)
46 if(a[a[i].to].v[j]==a[i].to)
47 printf("%d",ans),exit(0);
48 }
49 for(int i=1;i<=n;i++)
50 a[i].but=0;
51 }
52 return 0;
53 }
正确做法dfs求最小值
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 #include<map>
6 #include<stack>
7 #include<vector>
8 #include<cstdlib>
9 #include<algorithm>
10 #include<queue>
11 using namespace std;
12 const int MAXN=300001;
13 int n,a[MAXN];
14 int vis[MAXN];
15 int ans=0x7ffffff;
16 stack<int>s;
17 int dfs(int x)
18 {
19 s.push(x);
20 int num=0;
21 while(!s.empty())
22 {
23 int te=s.top();
24 if(!vis[te])
25 {
26 s.push(a[te]);
27 vis[te]=-1;
28 }
29 else if(vis[te]==-1)
30 {
31 s.pop();
32 vis[te]=1;
33 num++;
34 while(vis[s.top()]!=1)
35 {
36 vis[s.top()]=1;
37 s.pop();
38 num++;
39 }
40 s.pop();
41 while(!s.empty())
42 {
43 vis[s.top()]=1;
44 s.pop();
45 }
46 }
47 else if(vis[te]==1)
48 {
49 while(!s.empty())
50 {
51 vis[s.top()]=1;
52 s.pop();
53 }
54 }
55 }
56 return num;
57 }
58 int main()
59 {
60 freopen("2015message.in","r",stdin);
61 freopen("2015message.out","w",stdout);
62 scanf("%d",&n);
63 for(int i=1;i<=n;i++)
64 scanf("%d",&a[i]);
65
66 for(int i=1;i<=n;i++)
67 {
68 if(!vis[i])
69 {
70 int p=dfs(i);
71 if(p!=0)
72 ans=min(ans,p);
73 }
74 }
75 printf("%d",ans);
76 return 0;
77 }