比赛 20160323 评测结果 AAAAAAAAAA
题目名称 修剪花卉 最终得分 100
用户昵称 FETS 1/3 运行时间 0.025 s
代码语言 C++ 内存使用 0.73 MiB
提交时间 2016-03-23 20:04:06
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=16000+10;
int head[maxn],to[maxn*2],next[maxn*2],cnt=0;
int dq[maxn],f[maxn];
bool vis[maxn];
int n;
void add(int x,int y)
{
	cnt++;
	to[cnt]=y;
	next[cnt]=head[x];
	head[x]=cnt;
}
void dfs(int x)
{
	f[x]=dq[x];
	for (int i=head[x];i;i=next[i])
	{
		int v=to[i];
		if (!vis[v])
		{
			vis[v]=true;
			dfs(v);
			f[x]+=max(0,f[v]);
		}
	}
}
int main()
{
	freopen("makeup.in","r",stdin);
	freopen("makeup.out","w",stdout);
	memset(vis,false,sizeof(vis));
	memset(head,0,sizeof(head));
	scanf("%d",&n);
	for (int i=1;i<=n;i++) scanf("%d",&dq[i]);
	int x,y;
	for (int i=1;i<n;i++)
	{
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	vis[1]=true;
	dfs(1);
	int maxx=0;
	for (int i=1;i<=n;i++) 
		maxx=max(maxx,f[i]);
	printf("%d\n",maxx);
	return 0;
}