80分求助!!
查看原帖
80分求助!!
160767
afm_afk楼主2021/11/17 11:36

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;
} 
2021/11/17 11:36
加载中...