在农场万圣节

题目链接

抄的题解的链接
大体理解了思路,经常复习复习,不要忘了。

因为每个点的出度只有1,那么每个点向下走的路径是唯一的。
题解里说的两种情况
enter image description here

enter image description here
代码:

#include<iostream>
#include<cstdio>
#include<cstring>
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
",cnt);
				break;
			}
			else 
			{
				minc[cow]=minc[color[i]];
				sucdfn[cow]=cnt+max(sucdfn[color[i]]-dfn[i],0);
				printf("%d
",sucdfn[cow]+minc[cow]);
				break; 
			}
			++cnt;
		}
	}
}
原文地址:https://www.cnblogs.com/karryW/p/11396870.html