ZJNU 2201

在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;
}
原文地址:https://www.cnblogs.com/stelayuri/p/12236467.html