比赛 20151026 评测结果 AAAAAAAAAA
题目名称 火车站饭店 最终得分 100
用户昵称 Steve 运行时间 0.392 s
代码语言 C++ 内存使用 5.75 MiB
提交时间 2015-10-26 21:20:38
显示代码纯文本
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<vector>
#define maxn 100005
using namespace std;
struct node{
  int val,cnt;
  vector<int>son;
};
node sta[maxn];
bool f[maxn];
int x,y,n,dp[maxn][2];
int end[2*maxn],last[2*maxn],next[2*maxn],tot,fa[maxn];
void _add(int x,int y)
{
	tot++;
	end[tot]=y;
	next[tot]=last[x];
	last[x]=tot;
}
void _Maketree(int x)
{
	for(int i=last[x];i;i=next[i])
      if(f[end[i]]==false)
		{
			sta[x].cnt++;
			sta[x].son.push_back(end[i]);
			f[end[i]]=true;
			_Maketree(end[i]);
	    }
}
void _tree(int x)
{
	if(sta[x].cnt!=0)
	 for(int i=0;i<sta[x].cnt;i++)_tree(sta[x].son[i]);
	if(sta[x].cnt==0)
	{
		dp[x][0]=0;
		dp[x][1]=sta[x].val;
		return;
	}
	for(int i=0;i<sta[x].cnt;i++)
	{
		dp[x][0]+=max(dp[sta[x].son[i]][1],dp[sta[x].son[i]][0]);
		dp[x][1]+=dp[sta[x].son[i]][0];
	}
	dp[x][1]+=sta[x].val;
}
int main()
{
	freopen("profitz.in","r",stdin);
	freopen("profitz.out","w",stdout);
	int i,j,k;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
	  scanf("%d",&sta[i].val);
	  sta[i].cnt=0;
    }
	for(i=1;i<n;i++)
	{
	  scanf("%d%d",&x,&y);
	  _add(x,y);
	  _add(y,x);
    }
    f[1]=true;
    _Maketree(1);
    _tree(1);
    printf("%d",max(dp[1][1],dp[1][0]));
    //for(i=1;i<=n;i++)
    //printf("%d-->%d %d\n",i,dp[i][0],dp[i][1]);
	return 0;
}