比赛 |
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();
}