记录编号 66496 评测结果 AAAAAAAATA
题目名称 [USACO Dec08] 奶牛的糖果 最终得分 90
用户昵称 Gravatar隨風巽 是否通过 未通过
代码语言 C++ 运行时间 3.256 s
提交时间 2013-07-29 17:04:28 内存使用 1.55 MiB
显示代码纯文本
#include<iostream>
#include<fstream>
#include<cstdio>
#include<cstring>
using namespace std;
int N,i,next[100010],p=0,j,k,l,m,s[100010]={0},path[100010]={0},sc=0;
bool f[100010]={0};
int main()
{
	freopen("treat.in","r",stdin);
	freopen("treat.out","w",stdout);
	scanf("%d",&N);
	for(i=1;i<=N;i++)scanf("%d",&next[i]);
	for(i=1;i<=N;i++)
	{
		if(s[i]==0)
	    {
			f[i]=true;
		    k=0;
			path[k++]=i;
			for(j=next[i];f[j]==false;j=next[j])   //找到环
		    {	
				f[j]=true;              //做标记
			    path[k++]=j;             //按先后顺序记录顶点
			}
			for(l=0;l<k;l++)
			{	
				s[path[l]]=k-l;            
				if(path[l]==j)break;     //查找切入点
			}
			sc=k-l;
			for(l;l<k;l++)
				s[path[l]]=sc;
		}
		memset(f,0,sizeof(f));
	}
	for(i=1;i<=N;i++)printf("%d\n",s[i]);
	return 0;
}