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