记录编号 527600 评测结果 AAAAAAAAAA
题目名称 [USACO Dec08] 奶牛的糖果 最终得分 100
用户昵称 GravatarHZOI_RXR 是否通过 通过
代码语言 C++ 运行时间 0.980 s
提交时间 2019-02-17 21:12:46 内存使用 6.78 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 100050
int to[maxn],low[maxn],dfn[maxn],belong[maxn],stack[maxn],cirl[maxn],reto[maxn],candy[maxn],in[maxn];
bool vis[maxn],v[maxn];
int n,m,top,cnt,ind;
void tarjan(int u)
{
	dfn[u]=low[u]=++ind;
	vis[u]=1;
	stack[++top]=u;
	int end=to[u];
	if(!dfn[end])tarjan(end),low[u]=min(low[u],low[end]);
	else if(vis[end])low[u]=min(low[u],dfn[end]);
	if(dfn[u]==low[u])
	{
		
		int t;
		cnt++;
		do
		{
			t=stack[top--];
			cirl[cnt]++;
			belong[t]=cnt;
			vis[t]=0;
		}while(t!=u);
	}
}
void dfs(int x)
{
	if(candy[x])return ;
	v[x]=1;
	int t=reto[x];//cout<<111<<endl;
	if(t)dfs(t);
	
	if(!t)candy[x]=max(candy[x],cirl[x]);    
	else 
	candy[x]=max(candy[x],candy[t]+cirl[x]);


}
int main()
{
	freopen("treat.in","r",stdin);
	freopen("treat.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)scanf("%d",&to[i]);
	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
	for(int i=1;i<=n;i++)
	if(belong[i]!=belong[to[i]])reto[belong[i]]=belong[to[i]];
	for(int i=1;i<=cnt;i++)if(!v[i])dfs(i);
	for(int i=1;i<=n;i++)cout<<candy[belong[i]]<<endl;
}