记录编号 28835 评测结果 AAAAAAAAWW
题目名称 [USACO Nov10] 拜访奶牛 最终得分 80
用户昵称 Gravatarmagic 是否通过 未通过
代码语言 C++ 运行时间 0.068 s
提交时间 2011-10-17 21:19:33 内存使用 1.60 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#define maxlong 50005
	int f[maxlong][2];
	int da[maxlong*2];
	int next[maxlong*2];
	int last[maxlong];
	int tail,n;
using namespace std;
void dfs(int x,int y);
void dfs(int x,int y)
{
	int i,j,a,b;//i dian j ->
	i=da[x];
	j=next[x];
	if (i==0)
	{
		i=da[j];
		j=next[j];
	}
	a=1;
	b=0;
	while (i!=0)
	{
		if (f[i][0]==-1&&y!=i)
		{
			dfs(i,x);
		}
		if (y!=i)
		{
			a+=f[i][0];
			b+=max(f[i][0],f[i][1]);
		}
		i=da[j];
		j=next[j];
	}
	f[x][1]=a;
	f[x][0]=b;
}
void insert(int x,int y);
void insert(int x,int y)
{
	if (next[x]==0)
	{
		tail++;
		da[tail]=y;
		next[x]=tail;
		last[x]=tail;
	}
	else 
	{
		tail++;
		da[tail]=y;
		next[last[x]]=tail;
		last[x]=tail;
	}
}
int max(int x,int y);
int max(int x,int y)
{
	if (x>y) return (x);else return (y);
}
int main()
{
	freopen("vacation.in","r",stdin);
	freopen("vacation.out","w",stdout);
	scanf("%d",&n);
	tail=n;
	int a,b;
	for (int i=1;i<=n-1;i++)
	{
		scanf("%d%d",&a,&b);
		insert(a,b);
		insert(b,a);
	}
	for (int i=1;i<=n;i++)
	{
		f[i][0]=-1;
		f[i][1]=-1;
	}
	dfs(1,0);
	printf("%d",max(f[1][0],f[1][1]));
	return 0;
}