比赛 20151026 评测结果 AAAAAAAAAA
题目名称 火车站饭店 最终得分 100
用户昵称 Kt820 运行时间 0.497 s
代码语言 C++ 内存使用 25.20 MiB
提交时间 2015-10-26 21:36:30
显示代码纯文本
/*
f[p][1]xuan i hao dian
f[p][0]bu xuan i hao dian
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std;
int f[100005][2],N,son[100005][55],fa[100005],v[100005];
int ans,next[200005],last[200005],end[200005],tot;
bool mark[100005];
void make(int x)
{
	for(int i=last[x];i;i=next[i])
	{
		if(!mark[end[i]])
		{
			son[x][0]++;
			son[x][son[x][0]]=end[i];
			mark[end[i]]=1;
			make(end[i]);
		}
	}
}
void add(int x,int y)
{
	end[++tot]=y;
	next[tot]=last[x];
	last[x]=tot;
}
void dfs(int p)
{
	int i,j,s;
//	if(chose==1)f[i][1]+=v[p];
	for(i=1;i<=son[p][0];i++)dfs(son[p][i]);
	if(!son[p][0])
	{
		f[p][0]=0;
		f[p][1]=v[p];
		return;
	}
	for(i=1;i<=son[p][0];i++)
	{
		s=son[p][i];
		f[p][0]+=max(f[s][0],f[s][1]);
		f[p][1]+=f[s][0];
	}
	f[p][1]+=v[p];
}
int main()
{
	freopen("profitz.in","r",stdin);
	freopen("profitz.out","w",stdout);
	int i,j,k,s,e;
	bool GG;
	scanf("%d",&N);
	for(i=1;i<=N;i++)scanf("%d",&v[i]);
	for(i=1;i<N;i++)
	{
		scanf("%d%d",&s,&e);
		add(s,e);
		add(e,s);
	}
	mark[1]=1;
	make(1);
	dfs(1);
	printf("%d\n",max(f[1][0],f[1][1]));
	return 0;
}