CodeForces 1327D - Infinite Path

代码:

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int p[N],c[N];
vector<int>path[N];
int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&p[i]);
        for(int i=1;i<=n;i++)
            scanf("%d",&c[i]);
        for(int i=1;i<=n;i++)
            path[i].clear();
        int cnt=0;
        for(int i=1;i<=n;i++)//找环
        {
            if(p[i]==-1)
                continue;
            int t=i;
            cnt++;
            while(p[t]!=-1)
            {
                path[cnt].push_back(c[t]);
                int tt=p[t];
                p[t]=-1;
                t=tt;
            }
        }
        int ans=N<<2;
        for(int i=1;i<=cnt;i++)
        {//cout<<"sz->"<<path[i].size()<<endl;
            for(int j=0;j<path[i].size();j++)
            {
                if(path[i].size()%(j+1))//j+1为因子
                    continue;
                for(int k=0;k<=j;k++)//环起点
                {
                    bool f=1;
                    for(int u=k;u<path[i].size();u+=(j+1))
                    {
                        if(path[i][u]!=path[i][k])
                        {
                            f=0;
                            break;
                        }
                    }
                    if(f)
                    {
                        ans=min(ans,j+1);
                        break;
                    }
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

博客

posted @ 2020-03-26 15:38  xzx9  阅读(218)  评论(0编辑  收藏  举报