wa了两个点。有没有巨佬看看到底是思路的问题还是哪里没考虑到啊,给组hack也可以qwq
#include<bits/stdc++.h>
using namespace std;
int to[100005];
int vis[100005],color[100005],n;
int ans[100005],cnt;
int flag;
void dfs(int x,int step){
vis[x]=step;
color[x]=cnt;
int y=to[x];
if(color[y]&&color[y]!=cnt){//记忆化
ans[x]=1+ans[y];
flag=0;
return;
}
if(!color[y]){//没有搜过的点
dfs(y,step+1);
if(flag){//x在环上
ans[x]=ans[y];
if(flag==x)flag=0;//x是环上最后一个点
return ;
}
else{
ans[x]=ans[y]+1;
return;
}
}
else if(color[y]==cnt){//搜到了一样的点
ans[x]=vis[x]-vis[y]+1;
flag=y;
return;
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>to[i];
for(int i=1;i<=n;i++){
if(!color[i]){
cnt++;
dfs(i,1);
}
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<endl;
}
return 0;
}