比赛 |
20151026 |
评测结果 |
AAAAAAAAAA |
题目名称 |
火车站饭店 |
最终得分 |
100 |
用户昵称 |
Steve |
运行时间 |
0.392 s |
代码语言 |
C++ |
内存使用 |
5.75 MiB |
提交时间 |
2015-10-26 21:20:38 |
显示代码纯文本
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<vector>
#define maxn 100005
using namespace std;
struct node{
int val,cnt;
vector<int>son;
};
node sta[maxn];
bool f[maxn];
int x,y,n,dp[maxn][2];
int end[2*maxn],last[2*maxn],next[2*maxn],tot,fa[maxn];
void _add(int x,int y)
{
tot++;
end[tot]=y;
next[tot]=last[x];
last[x]=tot;
}
void _Maketree(int x)
{
for(int i=last[x];i;i=next[i])
if(f[end[i]]==false)
{
sta[x].cnt++;
sta[x].son.push_back(end[i]);
f[end[i]]=true;
_Maketree(end[i]);
}
}
void _tree(int x)
{
if(sta[x].cnt!=0)
for(int i=0;i<sta[x].cnt;i++)_tree(sta[x].son[i]);
if(sta[x].cnt==0)
{
dp[x][0]=0;
dp[x][1]=sta[x].val;
return;
}
for(int i=0;i<sta[x].cnt;i++)
{
dp[x][0]+=max(dp[sta[x].son[i]][1],dp[sta[x].son[i]][0]);
dp[x][1]+=dp[sta[x].son[i]][0];
}
dp[x][1]+=sta[x].val;
}
int main()
{
freopen("profitz.in","r",stdin);
freopen("profitz.out","w",stdout);
int i,j,k;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&sta[i].val);
sta[i].cnt=0;
}
for(i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
_add(x,y);
_add(y,x);
}
f[1]=true;
_Maketree(1);
_tree(1);
printf("%d",max(dp[1][1],dp[1][0]));
//for(i=1;i<=n;i++)
//printf("%d-->%d %d\n",i,dp[i][0],dp[i][1]);
return 0;
}