记录编号 |
241054 |
评测结果 |
AAAAAAAAAA |
题目名称 |
修剪花卉 |
最终得分 |
100 |
用户昵称 |
咸鱼二号 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.014 s |
提交时间 |
2016-03-24 12:37:35 |
内存使用 |
0.86 MiB |
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<utility>
#include<stdio.h>
#include<cstdlib>
#include<iomanip> //cout<<setiosflags(ios::fixed)<<setprecision(2);
#include<ctime> //double a=(double)clock(); cout<<a<<endl;
#include<vector>
#include<queue>
using namespace std;
const int maxn=16010;
inline long long read()
{
long long x=0;int ff=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')ff=-1; ch=getchar();}
while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}
return ff*x;
}
inline long long mymax(long long A,long long B)
{if(A>B)return A;return B;}
int N,t1,t2;
long long f[maxn],num[maxn],ans;
int lin[maxn],len=0;
struct edge
{
int y,next;
}e[maxn*2];
inline void insert(int xx,int yy)
{
e[++len].next=lin[xx];
lin[xx]=len;
e[len].y=yy;
}
long long dfs(int x,int fa)
{
if(f[x]!=-1)
return f[x];
f[x]=0;
for(int i=lin[x];i;i=e[i].next)
if(e[i].y!=fa)
f[x]+=dfs(e[i].y,x);
f[x]+=num[x];
if(f[x]<0)
f[x]=0;
return f[x];
}
int main()
{
freopen("makeup.in","r",stdin);
freopen("makeup.out","w",stdout);
N=read();
for(int i=1;i<=N;i++)
num[i]=read();
for(int i=1;i<N;i++)
{
t1=read(),t2=read();
insert(t1,t2);insert(t2,t1);
}
memset(f,-1,sizeof(f));
dfs(1,0);
ans=0;
for(int i=1;i<=N;i++)
ans=mymax(ans,f[i]);
cout<<ans<<endl;
return 0;
}