在dfs过程中加上栈记录当次dfs走过的路径
如果当次dfs到了一个之前的dfs已经经过的点
又因为只对没有访问过的点开始dfs
所以这种情况就说明接下来不可能返回到当次dfs开始的点
将栈内元素取出,恢复vis状态为未访问过,起始点保持访问过状态(说明这个点不可用)
最后找最优解
#include<stdio.h> #include<stdbool.h> #include<memory.h> #define mx 200010 int ar[mx],dat[mx],dn,num,par; bool vis[mx]; void dfs(int p){ dat[dn++]=p; vis[p]=true; num++; if(!vis[ar[p]]) dfs(ar[p]); else{ if(ar[p]!=par){ num=mx; while(dn) vis[dat[--dn]]=false; vis[dat[0]]=true; } } } int main(){ int n,i,ans=mx; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&ar[i]); memset(vis,false,sizeof vis); for(dn=0,i=1;i<=n;i++) if(!vis[i]){ num=0; par=i; dfs(i); ans=ans>num?num:ans; } printf("%d",ans); return 0; }