Pagini recente » Cod sursa (job #1629521) | Cod sursa (job #1673166) | Cod sursa (job #2543599) | Cod sursa (job #687752) | Cod sursa (job #537166)
Cod sursa(job #537166)
#include <stdio.h>
#include <vector>
#define pb push_back
#define TR(C, i)\
for(typeof(C.begin()) i = C.begin(); i < C.end(); i++)
using namespace std;
const int nmax = 1 << 14;
vector <int> fii[nmax];
vector <int> lev[nmax];
int T[nmax], levmax, bestmax = -1024, best[nmax], val[nmax];
void DFS(int x, int unde)
{
lev[unde].pb(x);
T[x] = 1;
TR(fii[x], i)
if(T[*i] == 0)
DFS(*i, unde + 1);
if(unde > levmax)
levmax = unde;
}
void up()
{
vector <int>::iterator it;
vector <int>::iterator jos;
int i;
for(i = levmax; i >= 0; i--)
for(it = lev[i].begin(); it < lev[i].end(); it++)
{
best[*it] = val[*it];
for(jos = fii[*it].begin(); jos < fii[*it].end(); jos++)
if(best[*jos] > 0)
best[*it] += best[*jos];
if(best[*it] > bestmax)
bestmax = best[*it];
}
printf("%d\n",bestmax);
}
int main()
{
freopen ("asmax.in","r",stdin);
freopen ("asmax.out","w",stdout);
int N, i, a, b;
scanf("%d",&N);
for(i = 1; i <= N; i++)
scanf("%d",&val[i]);
for(i = 1; i < N; i++)
{
scanf("%d %d",&a,&b);
fii[a].pb(b);
fii[b].pb(a);
}
DFS(1, 0);
up();
return 0;
}