标签:dn 2201 int dfs vis ar ZJNU mx 挖矿
在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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。