比赛 |
20151026 |
评测结果 |
AAAAAAAAAA |
题目名称 |
火车站饭店 |
最终得分 |
100 |
用户昵称 |
Hzoi_Mafia |
运行时间 |
0.156 s |
代码语言 |
C++ |
内存使用 |
4.22 MiB |
提交时间 |
2017-10-16 20:59:26 |
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int read(){
int sum=0;
char ch=getchar();
while(ch<'0'||ch>'9')
ch=getchar();
while(ch>='0'&&ch<='9'){
sum=sum*10+ch-'0';
ch=getchar();
}
return sum;
}
struct edge{
int s,e,n;
}a[200001];
int pre[100001],tot;
void init(int s,int e){
a[++tot].s=s;
a[tot].e=e;
a[tot].n=pre[s];
pre[s]=tot;
}
int n;
int x,y;
int w[100001];
int f[100001][2];
bool vis[100001];
int my_max(int a,int b){
return a>b?a:b;
}
int dfs(int u,int zt){
if(f[u][zt]!=-1)
return f[u][zt];
if(u==0)
return 0;
f[u][0]=0;
f[u][1]=w[u];
vis[u]=1;
for(int i=pre[u];i!=-1;i=a[i].n)
if(!vis[a[i].e]){
f[u][0]+=my_max(dfs(a[i].e,1),dfs(a[i].e,0));
f[u][1]+=dfs(a[i].e,0);
}
return f[u][zt];
}
main(){
freopen("profitz.in","r",stdin);
freopen("profitz.out","w",stdout);
memset(pre,-1,sizeof(pre));
memset(f,-1,sizeof(f));
n=read();
for(int i=1;i<=n;i++)
w[i]=read();
for(int i=1;i<n;i++){
x=read();
y=read();
init(x,y);
init(y,x);
}
cout<<my_max(dfs(1,0),dfs(1,1));/*cout<<' '<<f[1][0]<<' '<<f[1][1]/while(1);*/
}