在dfs过程中加上栈记录当次dfs走过的路径
如果当次dfs到了一个之前的dfs已经经过的点
又因为只对没有访问过的点开始dfs
所以这种情况就说明接下来不可能返回到当次dfs开始的点
将栈内元素取出,恢复vis状态为未访问过,起始点保持访问过状态(说明这个点不可用)
最后找最优解
1 #include<stdio.h> 2 #include<stdbool.h> 3 #include<memory.h> 4 #define mx 200010 5 int ar[mx],dat[mx],dn,num,par; 6 bool vis[mx]; 7 void dfs(int p){ 8 dat[dn++]=p; 9 vis[p]=true; 10 num++; 11 if(!vis[ar[p]]) 12 dfs(ar[p]); 13 else{ 14 if(ar[p]!=par){ 15 num=mx; 16 while(dn) 17 vis[dat[--dn]]=false; 18 vis[dat[0]]=true; 19 } 20 } 21 } 22 int main(){ 23 int n,i,ans=mx; 24 scanf("%d",&n); 25 for(i=1;i<=n;i++) 26 scanf("%d",&ar[i]); 27 memset(vis,false,sizeof vis); 28 for(dn=0,i=1;i<=n;i++) 29 if(!vis[i]){ 30 num=0; 31 par=i; 32 dfs(i); 33 ans=ans>num?num:ans; 34 } 35 printf("%d",ans); 36 37 return 0; 38 }