比赛 20151026 评测结果 AAAAAAAAAA
题目名称 火车站饭店 最终得分 100
用户昵称 GoodPersonBossHe 运行时间 0.295 s
代码语言 C++ 内存使用 4.61 MiB
提交时间 2015-10-26 20:03:03
显示代码纯文本
#include<iostream>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
using namespace std;
inline void _read(int &d)
{
	char t=getchar();bool f=false;
	while(t<'0'||t>'9'){if(t=='-')f=true;t=getchar();}
	for(d=0;t>='0'&&t<='9';t=getchar())d=d*10+t-'0';
	if(f==true)d=-d;
}
int n;
vector<int>son[100005];
int f[100005][2];
int get[100005];
int last[100005],next[200005],end[200005];
int cnt=0;
void addpath(int a,int b)
{
	cnt++;
	end[cnt]=b;next[cnt]=last[a];
	last[a]=cnt;
}
bool mark[100005];
void dfs(int x)
{
	mark[x]=true;
	int a,b,c,d;
	for(a=last[x];a!=0;a=next[a])
	{
		b=end[a];
		if(mark[b]==true)continue;
		son[x].push_back(b);
		dfs(b);
	}
}
void DP(int x,int y)
{
	if(f[x][y]!=0)return;
	int a,b,c,d,e;
	if(y==0)
	{
	   for(a=0;a<=int(son[x].size())-1;a++)
	   {
		DP(son[x][a],0);DP(son[x][a],1);
	   }
	   for(a=0;a<=int(son[x].size())-1;a++)f[x][y]+=f[son[x][a]][0];
	   e=0;
	   for(a=0;a<=int(son[x].size())-1;a++)e+=f[son[x][a]][1];
	   e+=get[x];
	   f[x][y]=max(f[x][y],e);
    }
    else
    {
    	for(a=0;a<=int(son[x].size())-1;a++)DP(son[x][a],0);
    	for(a=0;a<=int(son[x].size())-1;a++)f[x][y]+=f[son[x][a]][0];
    }
}
int main()
{
	freopen("profitz.in","r",stdin);
	freopen("profitz.out","w",stdout);
	int a,b,c,d,e;
	_read(n);
	for(a=1;a<=n;a++)_read(get[a]);
	for(a=1;a<=n-1;a++)
	{
		_read(b);_read(c);
		addpath(b,c);addpath(c,b);
	}
	dfs(1);
	DP(1,0);
	cout<<f[1][0];
	return 0;
}