LUOGU P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
2024-10-08 01:57:58
解题思路
记忆化搜索,如果搜到环,就将环的大小处理出来。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN = 100005;
inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
int n,nxt[MAXN],f[MAXN];
int vis[MAXN],num,k;
inline int solve(int x){ //处理环的大小
int ret=0;int pre=x;
while(nxt[x]!=pre) {
ret++;
x=nxt[x];
}
return ret+1;
}
inline int dfs(int x){
if(f[x]) return f[x];
if(vis[x]==num){
if(x==nxt[x]) return 0;
f[x]=solve(x);k=x;return f[x];
}
vis[x]=num;
int F=dfs(nxt[x]);
if(!k) {f[x]=F+1;return F+1;} //k表示是否成环
else if(k==x) {k=0;f[x]=F;return F;}
else {f[x]=F;return F;}
}
int main(){
n=rd();
for(register int i=1;i<=n;i++) nxt[i]=rd();
for(register int i=1;i<=n;i++){
k=0;num++;
printf("%d\n",dfs(i));
}
return 0;
}
最新文章
- Spring-boot 开发Web应用
- Apache2.4部署django出现403 Forbidden错误解决办法
- 分布式事务二阶提交DTS系统
- springboot使用之三:springboot使用logback日志
- 创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
- javaWeb学习之运用myeclipse结合tomcat开发一些简单的jsp和service
- swift简介
- HDU 2159 FATE【二维完全背包】
- JAVA - Blowfish加密出现java.security.InvalidKeyException: Illegal key size 解决方案
- 重载public Primes ():this(2,100)
- MySql的rpm安装
- Delphi自定义消息应用及delphi托盘实现
- 什么是SSL
- 零基础学Python--------第3章 流程控制语句
- websocket的简单使用
- 【Linux】linux下gzip的压缩/解压缩详解
- HDU 6150 Vertex Cover(构造)
- 为控件动态添加Style
- 实例讲解JQuery中this和$(this)区别
- PowerShell 惠普打印机双面驱动自动设置已安装