Pagini recente » Cod sursa (job #909057) | Borderou de evaluare (job #2012076) | Cod sursa (job #2627408) | Cod sursa (job #915202) | Cod sursa (job #537160)
Cod sursa(job #537160)
#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);
TR(fii[x], i)
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);
T[b] = a;
}
for(i = 1; i <= N; i++)
if(!T[i])
{
DFS(i, 0);
break;
}
up();
return 0;
}