比赛 |
20111109 |
评测结果 |
AAAAAAAAAA |
题目名称 |
火车站饭店 |
最终得分 |
100 |
用户昵称 |
Truth.Cirno |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2011-11-09 10:26:25 |
显示代码纯文本
#include <cstdio>
#include <iostream>
using namespace std;
int n,maxdep=1,ben[100001]/*,dad[100001]*/,dep[100001]={0},way[100001]={0},map[100001][51];
long long f[100001][2]={{0}};
bool used[100001]={false},una[100001][51]={{false}};
long long findmax(long long a,long long b)
{
if (a>b)
return(a);
else
return(b);
}
void make(int pos,int depnow)
{
int i,j;
if (depnow>maxdep)
maxdep=depnow;
dep[pos]=depnow;
for (i=0;i<way[pos];i++)
{
if (!una[pos][i])
{
for (j=0;j<way[map[pos][i]];j++)
if (map[map[pos][i]][j]==pos)
{
una[map[pos][i]][j]=true;
break;
}
// dad[map[pos][i]]=pos;
make(map[pos][i],depnow+1);
}
}
}
void work(int pos,int depnow)
{
int i;
long long temp=0,temp2=0;
if (depnow==maxdep)
{
f[pos][1]=ben[pos];
f[pos][0]=0;
}
else
{
for (i=0;i<way[pos];i++)
{
if (!una[pos][i])
{
work(map[pos][i],depnow+1);
}
}
for (i=0;i<way[pos];i++)
{
if (!una[pos][i])
{
temp+=findmax(f[map[pos][i]][1],f[map[pos][i]][0]);
temp2+=f[map[pos][i]][0];
}
}
f[pos][0]=temp;
f[pos][1]=temp2+ben[pos];
}
}
/*
long long fill(int x,bool flag)
{
int i;
long long temp;
if (flag==1)
{
temp=0;
for (i=0;i<way[x];i++)
{
if (!used[map[x][i]])
{
used[map[x][i]]=true;
temp+=fill(f[map[x][i]][0],0);
used[map[x][i]]=false;
}
}
return(temp);
}
else //if (flag==0)
{
}
return(0);
}
*/
int main(void)
{
freopen("profitz.in","r",stdin);
freopen("profitz.out","w",stdout);
int i,temp,temp2;
scanf("%d\n",&n);
for (i=1;i<=n;i++)
scanf("%d\n",&ben[i]);
for (i=1;i<=n-1;i++)
{
scanf("%d %d\n",&temp,&temp2);
map[temp][way[temp]++]=temp2;
map[temp2][way[temp2]++]=temp;
}
// used[1]=true;
// f[1][0]=fill(1,0);
// f[1][1]=fill(1,1);
make(1,1);
work(1,1);
if (f[1][0]>f[1][1])
cout<<f[1][0]<<endl;
else
cout<<f[1][1]<<endl;
fclose(stdin);
fclose(stdout);
return(0);
}