记录编号 33200 评测结果 AAAAAAAAAA
题目名称 火车站饭店 最终得分 100
用户昵称 GravatarTruth.Cirno 是否通过 通过
代码语言 C++ 运行时间 0.464 s
提交时间 2011-11-09 18:20:39 内存使用 26.14 MiB
显示代码纯文本
#include <cstdio>
using namespace std;

int n,ben[100001]={0},way[100001]={0},map[100001][51]={{0}},f[100001][2]={{0}};
bool una[100001][51]={{false}};

int findmax(int a,int b)
{
	if (a>b)
		return(a);
	else
		return(b);
}

void work(int pos)
{
	int i,j,temp=0,temp2=0;
	for (i=0;i<way[pos];i++)
		if (!una[pos][i])
		{
			for (j=0;j<way[map[pos][i]];j++)
				if (map[map[pos][i]][j]==pos)
				{
					una[map[pos][i]][j]=true;
					break;
				}
			work(map[pos][i]);
			temp+=findmax(f[map[pos][i]][1],f[map[pos][i]][0]);
			temp2+=f[map[pos][i]][0];
		}
	f[pos][0]=temp;
	f[pos][1]=temp2+ben[pos];
}

int main(void)
{
	freopen("profitz.in","r",stdin);
	freopen("profitz.out","w",stdout);
	int i,temp,temp2;
	scanf("%d\n",&n);
	for (i=1;i<=n;i++)
		scanf("%d\n",&ben[i]);
	for (i=1;i<=n-1;i++)
	{
		scanf("%d %d\n",&temp,&temp2);
		map[temp][way[temp]++]=temp2;
		map[temp2][way[temp2]++]=temp;
	}
	work(1);
	if (f[1][0]>f[1][1])
		printf("%d\n",f[1][0]);
	else
		printf("%d\n",f[1][1]);
	fclose(stdin);
	fclose(stdout);
	return(0);
}