比赛 20111109 评测结果 AAAAAAAAAA
题目名称 火车站饭店 最终得分 100
用户昵称 Citron酱 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-11-09 09:58:24
显示代码纯文本
#include <fstream>

#define I_F "profitz.in"
#define O_F "profitz.out"

const long MAXn=100000;

struct Ans
{
	long a,b;
}ans;

struct lb
{
	long x;
	lb *next;
}*map[MAXn]={NULL};

long n;
long s[MAXn];
bool f[MAXn]={false};

void Addedge(const long, const long);
void Input();
inline long Max(const long, const long);
Ans Tdyna(const long);
void Output();

int main()
{
	Input();
	ans=Tdyna(0);
	Output();
	return 0;
}

void Addedge(const long a, const long b)
{
	lb *t=map[a];
	map[a]=new lb;
	map[a]->x=b;
	map[a]->next=t;
	t=map[b];
	map[b]=new lb;
	map[b]->x=a;
	map[b]->next=t;
}

void Input()
{
	long a,b;
	std::ifstream fin(I_F);
	fin>>n;
	for (long i=0; i<n; fin>>s[i++]);
	for (long i=1; i<n; i++)
	{
		fin>>a>>b;
		Addedge(a-1,b-1);
	}
	fin.close();
}

inline long Max(const long a, const long b)
{
	return (a<b)?b:a;
}

Ans Tdyna(const long x)
{
	f[x]=true;
	Ans t,r;
	r.a=s[x];
	r.b=0;
	for (lb *i=map[x]; i!=NULL; i=i->next)
		if (!f[i->x])
		{
			t=Tdyna(i->x);
			r.a+=t.b;
			r.b+=Max(t.a,t.b);
		}
	return r;
}

void Output()
{
	std::ofstream fout(O_F);
	fout<<Max(ans.a,ans.b)<<std::endl;
	fout.close();
}