比赛 |
20151026 |
评测结果 |
AAAAAAAAAA |
题目名称 |
火车站饭店 |
最终得分 |
100 |
用户昵称 |
GoodPersonBossHe |
运行时间 |
0.295 s |
代码语言 |
C++ |
内存使用 |
4.61 MiB |
提交时间 |
2015-10-26 20:03:03 |
显示代码纯文本
#include<iostream>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
using namespace std;
inline void _read(int &d)
{
char t=getchar();bool f=false;
while(t<'0'||t>'9'){if(t=='-')f=true;t=getchar();}
for(d=0;t>='0'&&t<='9';t=getchar())d=d*10+t-'0';
if(f==true)d=-d;
}
int n;
vector<int>son[100005];
int f[100005][2];
int get[100005];
int last[100005],next[200005],end[200005];
int cnt=0;
void addpath(int a,int b)
{
cnt++;
end[cnt]=b;next[cnt]=last[a];
last[a]=cnt;
}
bool mark[100005];
void dfs(int x)
{
mark[x]=true;
int a,b,c,d;
for(a=last[x];a!=0;a=next[a])
{
b=end[a];
if(mark[b]==true)continue;
son[x].push_back(b);
dfs(b);
}
}
void DP(int x,int y)
{
if(f[x][y]!=0)return;
int a,b,c,d,e;
if(y==0)
{
for(a=0;a<=int(son[x].size())-1;a++)
{
DP(son[x][a],0);DP(son[x][a],1);
}
for(a=0;a<=int(son[x].size())-1;a++)f[x][y]+=f[son[x][a]][0];
e=0;
for(a=0;a<=int(son[x].size())-1;a++)e+=f[son[x][a]][1];
e+=get[x];
f[x][y]=max(f[x][y],e);
}
else
{
for(a=0;a<=int(son[x].size())-1;a++)DP(son[x][a],0);
for(a=0;a<=int(son[x].size())-1;a++)f[x][y]+=f[son[x][a]][0];
}
}
int main()
{
freopen("profitz.in","r",stdin);
freopen("profitz.out","w",stdout);
int a,b,c,d,e;
_read(n);
for(a=1;a<=n;a++)_read(get[a]);
for(a=1;a<=n-1;a++)
{
_read(b);_read(c);
addpath(b,c);addpath(c,b);
}
dfs(1);
DP(1,0);
cout<<f[1][0];
return 0;
}