比赛 2019级快乐小组模拟赛19.9.19 评测结果 AAAAAAAAAA
题目名称 没有上司的舞会 最终得分 100
用户昵称 leon 运行时间 0.012 s
代码语言 C++ 内存使用 13.80 MiB
提交时间 2019-09-23 20:07:41
显示代码纯文本
#include<stdio.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=6100;
struct edge
{
	int to,next;
}e[maxn];
int rt=0,f[maxn][2],w[maxn],len,head[maxn];
bool v[maxn];
void insert(int x,int y)
{
	len++;e[len].to=y;e[len].next=head[x];head[x]=len;
}
int dfs(int x,int col)
{
	if(f[x][col])return f[x][col];
	if(col==0)
	{
		for(int i=head[x];i;i=e[i].next)
		{
			f[x][col]+=max(dfs(e[i].to,1),dfs(e[i].to,0));
		}	
	}	
	else
	{
		for(int i=head[x];i;i=e[i].next)
		{
			f[x][col]+=dfs(e[i].to,0); 
		} 
		f[x][col]+=w[x];
	}
	return f[x][col];
} 
int main()
{
	freopen("partyy.in","r",stdin);
	freopen("partyy.out","w",stdout);
	int n;
	while(scanf("%d",&n))
	{
		if(n==0)
		{
			scanf("%d",&n);
			break; 
		}
		len=0;
		memset(head,0,sizeof(head));
		memset(f,0,sizeof(f));
		memset(v,0,sizeof(v));
		for(int i=1;i<=n;++i)scanf("%d",&w[i]);
		for(int i=1,x,y;i<n;++i)
		{
			scanf("%d%d",&x,&y);
			insert(y,x);
			v[x]=1;
		} 
		for(int i=1;i<=n;++i)
		{
			if(!v[i])
			{
				rt=i;
				break;
			}
		}
		printf("%d\n",max(dfs(rt,0),dfs(rt,1)));
	}	
	return 0;
}