题解 CF1020B 【Badge】

· · 题解

我的做法是纯模拟,这道题可以想象成一个链表,坏同学指向另一个坏同学,然后顺着链表走一遍,任何一个同学走遍历了两遍时,停止遍历,并输出该同学的编号即可!

#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;
}