因为每个点的出度只有1,那么每个点向下走的路径是唯一的。
题解里说的两种情况 代码:#include#include #include using namespace std;const int N = 200005;int n,net[N],color[N],sucdfn[N],dfn[N],minc[N];int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&net[i]); for(int cow=1;cow<=n;++cow) { int cnt=0; for(int i=cow;;i=net[i]) { if(!color[i]) { color[i]=cow; dfn[i]=cnt; } else if(color[i]==cow) { minc[cow]=cnt-dfn[i]; sucdfn[cow]=dfn[i]; printf("%d\n",cnt); break; } else { minc[cow]=minc[color[i]]; sucdfn[cow]=cnt+max(sucdfn[color[i]]-dfn[i],0); printf("%d\n",sucdfn[cow]+minc[cow]); break; } ++cnt; } }}