ZJNU 2201 - 挖矿谷物语

在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 }

 

上一篇:ZJNU 1265 - 幸运的硬币——高级 (矩阵快速幂)


下一篇:使用css3属性border-image实现锯齿边框