您的位置:首页 > 其它

POJ 2369 Permutations

2016-07-07 15:16 435 查看
傻逼图论。

#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\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: