这题是一个图,其中有若干个环,求所有环的顶点数的最小公倍数。
先建图,然后DFS遍历求出所有的环的顶点数,再求最小公倍数。
由于每个顶点只有一个出边,释放边的函数写的很不规范,不过这题够用了。
int gcd(int a,int b){while(b){int t=a%b;a=b;b=t;} return a;}
int lcm(int a,int b){return a/gcd(a,b)*b;}
struct ArcNode{
int to;
ArcNode *next;
};
struct Node{
int vis;
ArcNode* List;
};
Node node[1000];
int D[1000];
int N;
void Arc(int i,int to){//建边
ArcNode *temp=new(ArcNode);
temp->to=to;
temp->next=node[i].List;
node[i].List=temp;
}
int DFS(int i);
int main(void)
{
cin>>N;
int a;
for(int i=0;i<N;i++){
scanf("%d",&a);
Arc(i,a-1);
node[i].vis=0;
}
int ANS=1;
for(int i=0;i<N;i++){
ANS=lcm(ANS,DFS(i));
}
cout<<ANS<<endl;
for(int i=0;i<N;i++){
delete node[i].List;
}
return 0;
}
int DFS(int i){
if(node[i].vis) return 1;
node[i].vis=1;
ArcNode *temp=node[i].List;
if(temp){
if(node[temp->to].vis) return 1;
else return DFS(temp->to)+1;
}
else{
printf("ERROR!\n");
}
}