题解 CF1020B 【Badge】
virtualman · · 题解
我的做法是纯模拟,这道题可以想象成一个链表,坏同学指向另一个坏同学,然后顺着链表走一遍,任何一个同学走遍历了两遍时,停止遍历,并输出该同学的编号即可!
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <string.h>
using namespace std;
int p[1005];
int book[1005]={0};
int pan(int x)
{
memset(book,0,sizeof(book));
int now=x;
while(1)
{
book[now]++;
now=p[now];
if(book[now]==2)return now;
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
}
for(int i=1;i<=n;i++)
{
cout<<pan(i)<<" ";
}
return 0;
}