记录编号 134142 评测结果 AAAAAAAAAA
题目名称 最长链 最终得分 100
用户昵称 Gravatar奶猹 是否通过 通过
代码语言 C++ 运行时间 0.026 s
提交时间 2014-10-29 15:45:40 内存使用 0.55 MiB
显示代码纯文本
#include<cstdio>
const short sizeque=1500;

int n;
struct aaa{
	short to;
	short next;
	int data;
}a[20001];
short head0[10001];
short tot=0;
int dis0[10001],dis1[10001];
bool b[10001];
short rec0,rec1;
int ans;
int q[sizeque],head=1,tail=0;//循环队列头、尾指针

inline void init();
inline void spfa();
inline void outit();
inline void insert(int ,int ,int );
inline int front(){return q[(head)%sizeque];} //队列的各种操作
inline void push(int x){q[(++tail)%sizeque]=x;}
inline void pop(){head++;}
inline bool empty(){return head>tail;}
inline int max(int a,int b){if(a>b)return a;else return b;}

int main()
{
	freopen("length.in","r",stdin);
	freopen("length.out","w",stdout);
	init();
	spfa();
	outit();
	fclose(stdin);
	fclose(stdout);
	return 0;
}
inline void init()
{
	scanf("%d",&n);
	int x,v;
	for(int i=2;i<=n;i++)
	{
		scanf("%d%d",&x,&v);
		insert(x,i,v);
		insert(i,x,v);
	}
}
inline void spfa()
{
	for(int i=1;i<=n;i++)
	dis0[i]=dis1[1]=b[i]=0;
	push(1);
	b[1]=1;
	rec0=1;
	while(!empty())
	{
		int k=front();
		for(int i=head0[k];i;i=a[i].next)
		{
			int t=a[i].to;
			if(!b[t])
			{
				push(t);
			 	b[t]=1;
			 	dis0[t]=dis0[k]+a[i].data;
			}
		}
		pop();
	}
	for(int i=1;i<=n;i++)
	if(dis0[i]>dis0[rec0]) rec0=i;//找一个最远点
	for(int i=1;i<=n;i++)
	dis0[i]=b[i]=0;
	push(rec0);
	b[rec0]=1;
	dis0[rec0]=0;
	while(!empty())
	{
		int k=front();
		pop();
		for(int i=head0[k];i;i=a[i].next)
		{
			int t=a[i].to;
	 		{
				if(!b[t])
				{
					dis0[t]=dis0[k]+a[i].data;
					push(t);
					b[t]=1;
				}
			}
		}		
	}
	rec1=1;
	for(int i=1;i<=n;i++)//找另一个最远点,因为最后一个出队的不一定最远
	if(dis0[i]>dis0[rec1]) rec1=i;
	for(int i=1;i<=n;i++)
	b[i]=0;
	push(rec1);
	b[rec1]=1;
	dis1[rec1]=0;
	while(!empty())
	{
		int k=front();
		for(int i=head0[k];i;i=a[i].next)
		{
			int t=a[i].to;
			if(!b[t])
			{
				dis1[t]=dis1[k]+a[i].data;
				push(t);
				b[t]=1;
			}
				
		}
		pop();
		b[k]=1;
	}
	
}
inline void outit()
{
	for(int i=1;i<=n;i++)
	printf("%d\n",max(dis0[i],dis1[i]));
}
inline void insert(int x,int y,int v)
{
	tot++;
	a[tot].to=y;
	a[tot].next=head0[x];
	a[tot].data=v;
	head0[x]=tot;
}