POJ 2369 Permutations

傻逼图论。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 1050
#define maxn 1050
#define maxe 2050
using namespace std;
int n,p[maxn],nume=0,g[maxv],ans[maxn],sum=1,cnt=0;
bool vis[maxn];
struct edge
{
    int v,nxt;
}e[maxe];
void addedge(int u,int v)
{
    e[++nume].v=v;
    e[nume].nxt=g[u];
    g[u]=nume;
}
int gcd(int x,int y)
{
    if (x==0) return y;
    if (y==0) return x;
    return gcd(y,x%y);
}
int dfs(int x)
{
    vis[x]=true;
    for (int i=g[x];i;i=e[i].nxt)
    {
        if (!vis[e[i].v])
            return dfs(e[i].v)+1;
    }
    return 1;
}
int main()
{
    while (scanf("%d",&n)!=EOF)
    {
        nume=0;
        cnt=0;sum=1;
        for (int i=1;i<=n;i++)
        {
            scanf("%d",&p[i]);
            addedge(i,p[i]);
            addedge(p[i],i);    
        }    
        for (int i=1;i<=n;i++)
        {
            if (!vis[i])
                ans[++cnt]=dfs(i);
        }
        for (int i=1;i<=cnt;i++)
            sum=(sum*ans[i])/gcd(sum,ans[i]);
        printf("%d
",sum);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/ziliuziliu/p/5650219.html