其他分享
首页 > 其他分享> > ZJNU 2201 - 挖矿谷物语

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 }

 

标签:dn,2201,int,dfs,vis,ar,ZJNU,mx,挖矿
来源: https://www.cnblogs.com/stelayuri/p/12236467.html