CF1020B Badge 【模拟链表】

n个点(n<=1000)
接下来n个整数表示ai
第i个数ai表示i到ai有一条边

输出:
n个数
表示从第i个点出发,最先被访问两次的点
样例1: 从1 出发,先到达2,2会到达3,3又到达2. 2被访问第二次。输出 2 从2 出发,先到达3,3到达2,2被访问两次,输出 2

从3 出发,先到2 ,2 又到3,3被访问2次,输出 3

#include<cstdio>
#include<string>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<cstring>
#include<set>
#include<queue>
#include<algorithm>
#include<vector>
#include<map>
#include<cctype>
#include<stack>
#include<sstream>
#include<list>
#include<assert.h>
#include<bitset>
#include<numeric>
#define mod 10003
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int INF = 1<<30;
const int maxn = 1000003;
const double eps = 1e-8;
int t,n,m,q;
int a[maxn],v[maxn];
int ok(int x)
{
    memset(v,0,sizeof(v));
    while(1)
    {
        v[x]++;
        if(v[x]==2) return x;
        x=a[x];
    }
}
int main()
{
    while(cin>>n)
    {
        memset(v,0,sizeof(v));
        for(int i=1;i<=n;i++)
            cin>>a[i];
        for(int i=1;i<=n;i++)
        {
            if(i==1) cout<<ok(i); else cout<<' '<<ok(i);
        }
        cout<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Roni-i/p/9528951.html