码迷,mamicode.com
首页 > 其他好文 > 详细

ZJNU 2201 - 挖矿谷物语

时间:2020-01-27 19:28:46      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:不可   恢复   printf   说明   dfs   路径   --   oid   can   

在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 2201 - 挖矿谷物语

标签:不可   恢复   printf   说明   dfs   路径   --   oid   can   

原文地址:https://www.cnblogs.com/stelayuri/p/12236467.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!