Pagini recente » Cod sursa (job #2137571) | Cod sursa (job #2156765) | Cod sursa (job #654271) | Cod sursa (job #488662) | Cod sursa (job #1833627)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define NMAX 16001
vector<int> arb[NMAX];
int n;
int v[NMAX];
int d[NMAX];
int tata[NMAX];
#define pb push_back
void citire()
{
scanf("%d ",&n);
for(int i=1;i<=n;i++)
scanf("%d ",&v[i]);
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d %d ",&x,&y);
arb[x].pb(y);
arb[y].pb(x);
}
}
int root = 1;
void tati()
{
queue<int>q;
q.push(root);
tata[root]=0;
while(!q.empty())
{
int nod = q.front();
q.pop();
for(vector<int>::iterator it=arb[nod].begin();it!=arb[nod].end();it++)
{
if(!tata[*it] && *it != root)
{
tata[*it]=nod;
q.push(*it);
}
}
}
}
void dinamica()
{
for(int i=1;i<=n;i++)
d[i]=v[i];
for(int i=1;i<=n;i++)
{
int value = 0;
for(int j=1;j<=n;j++)
if(tata[j]==i && d[j]>0)
value += d[j];
d[i]=v[i]+value;
}
}
int main()
{
freopen("asmax.in","r",stdin);
freopen("asmax.out","w",stdout);
citire();
tati();
dinamica();
printf("%d\n",*max_element(d,d+n+1));
return 0;
}