Pagini recente » Cod sursa (job #3120713) | Utilizatori inregistrati la preONI 2007, Runda 4, Clasele 11-12 | Cod sursa (job #3005379) | Cod sursa (job #1710017) | Cod sursa (job #478878)
Cod sursa(job #478878)
#include <cstdio>
#include <vector>
#include <deque>
#include <cstring>
using namespace std;
deque <int> up;
vector <int> ok[16008];
int f[16000],t[16000];
int main()
{
int v[16008],max[16008],a,b,i,n;
max[0]=-1000;
freopen("asmax.in","r",stdin);
freopen("asmax.out","w",stdout);
scanf("%d",&n);
for (i=1;i<=n;max[i]=-1000,++i)
scanf("%d",&v[i]);
for (i=1;i<n;++i)
{scanf("%d %d",&a,&b);ok[a].push_back(b);ok[b].push_back(a);}
for (b=0,i=1;i<=n;++i)
if (ok[i].end()-ok[i].begin()<2)
{max[i]=v[i],f[i]=1;
if (!t[ok[i].front()]) ++b,up.push_back(ok[i].front());
}
while (b>0)
{
int f2[]={},t2[]={};
for (i=b,b=0;i>0;--i)
{
int x=up.front(),sum=v[x];up.pop_front();
int q[16008],pl=0,j;
for (;!ok[x].empty();)
{++pl,q[pl]=ok[x].back();ok[x].pop_back();}
for (j=1;j<=pl;++j)
{ok[x].push_back(q[j]);
if (f[q[j]])
sum+=v[q[j]]; else
if (!t2[ok[i].front()]) up.push_back(q[j]),++b;
}
f2[x]=1;
if (sum>max[i]) max[i]=sum;
}
for (i=1;i<=n;++i) f[i]=f2[i];
}
for (i=1;i<=n;++i) if (max[i]>max[0]) max[0]=max[i];
printf("%d",max[0]);
return 0;}