社区讨论
六亲不认的代码
P2921[USACO08DEC] Trick or Treat on the Farm G参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mi85xy8l
- 此快照首次捕获于
- 2025/11/21 09:10 4 个月前
- 此快照最后确认于
- 2025/11/21 09:10 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
int n,next[100001],f[100001];
int vis[100001],T=0,P,h[100001];
void dfs(int k,int deep){
if(h[k]) return;
if(vis[k]){
T=k;P=deep-vis[k];
f[k]=P;h[k]=1;
return;
}
vis[k]=deep;
dfs(next[k],deep+1);
h[k]=1;
vis[k]=0;
if(T&&k==T){
f[k]=P;T=0;P=0;h[k]=1;
return;
}
if(T){
h[k]=1;f[k]=P;return;
}
return;
}
int dp(int k){
if(f[k]) return f[k];
return f[k]=dp(next[k])+1;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&next[i]),f[i]=0;
memset(vis,0,sizeof(vis));
memset(h,0,sizeof(h));
for(register int i=1;i<=n;++i)
if(h[i]) continue;
else dfs(i,1);
for(int i=1;i<=n;++i)
printf("%d\n",dp(i));
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...