题目:[USACO08DEC]在农场万圣节Trick or Treat on the Farm
思路:
图的dfs遍历,有点难写,差不多跟noip2018 day2T1旅行的O(n)差不多的写法。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 100000
#define read(x) scanf("%d",&x)
int n;
int a[maxn+5];
int vis[maxn+5];
bool inc[maxn+5];
int pre[maxn+5];
int cnt,s=0;
void dfs(int x) {
if(pre[x]) {
if(vis[x]==-1) vis[x]=cnt-pre[x]+1,inc[x]=true;
else s=1;
return ;
}
pre[x]=++cnt;
vis[x]=-1;
dfs(a[x]);
if(inc[x]) s=1;
else vis[x]=s+vis[a[x]];
if(s==0) inc[x]=true;
return ;
}
int main() {
read(n);
for(int i=1; i<=n; i++) read(a[i]);
for(int i=1; i<=n; i++) {
if(!vis[i]) {
s=0;
dfs(i);
}
}
for(int i=1;i<=n;i++) printf("%d\n",vis[i]);
return 0;
}