在农场万圣节Trick or Treat on the Farm
Description
每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节。
由于牛棚不太大,FJ通过指定奶牛必须遵循的穿越路线来确保奶牛的乐趣。为了实现这个让奶牛在牛棚里来回穿梭的方案,FJ在第i号隔间上张贴了一个“下一个隔间”Next_i(1<=Next_i<=N),告诉奶牛要去的下一个隔间;这样,为了收集它们的糖果,奶牛就会在牛棚里来回穿梭了。
FJ命令奶牛i应该从i号隔间开始收集糖果。如果一只奶牛回到某一个她已经去过的隔间,她就会停止收集糖果。
在被迫停止收集糖果之前,计算一下每头奶牛要前往的隔间数(包含起点)。
Input
第1行 整数n。
第2行到n+1行 每行包含一个整数 next_i 。
output
n行,第i行包含一个整数,表示第i只奶牛要前往的隔间数。
Examples
Input
4
1
3
2
3
Output
1
2
2
3
正确解法:
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<map> 6 #include<set> 7 #include<vector> 8 #include<queue> 9 #include<algorithm> 10 #include<cmath> 11 using namespace std; 12 typedef long long ll; 13 const int N=100000+100; 14 int Link[N],len=0,bok[N]; 15 int n,yy,ans[N],que[N]; 16 struct student 17 { 18 int y,next; 19 }e[N]; 20 void insert(int xx,int yy) 21 { 22 e[++len].next=Link[xx]; 23 Link[xx]=len; 24 e[len].y=yy; 25 } 26 int bfs(int x) 27 { 28 memset(bok,0,sizeof(bok)); 29 int head=1,tail=2; 30 ans[x]++; 31 que[head]=x; 32 bok[x]=1; 33 while(head<tail) 34 { 35 for(int i=Link[que[head]];i;i=e[i].next) 36 { 37 if(!bok[e[i].y]) 38 { 39 ans[x]++; 40 bok[e[i].y]=1; 41 que[tail++]=e[i].y; 42 } 43 } 44 head++; 45 } 46 return ans[x]; 47 } 48 int main() 49 { 50 scanf("%d",&n); 51 for(int i=1;i<=n;i++) 52 { 53 scanf("%d",&yy); 54 insert(i,yy); 55 } 56 for(int i=1;i<=n;i++) 57 cout<<bfs(i)<<endl; 58 59 return 0; 60 }