Pagini recente » Cod sursa (job #1832280) | Cod sursa (job #334958) | Cod sursa (job #1815460) | Cod sursa (job #1299717) | Cod sursa (job #135039)
Cod sursa(job #135039)
#include<stdio.h>
#include<vector>
using namespace std;
#define infinit 0x3f3f3f3f
#define lg 16005
int n, i, rsp[lg], fst[lg], val[lg], nr[lg], mx, x, y, pus[lg];
vector<int> v[lg];
void df(int nod, int str, int s){
int i, nxt, prv;
fst[nod] = 1;
if (s + val[nod] > rsp[nod])
rsp[nod] = s + val[nod];
//fprintf(stderr, "la intrare pentru nodul %d este %d\n", nod, rsp[nod]);
if (rsp[nod] < 0)
nxt = 0;
else
nxt = rsp[nod], pus[nod] = 1;
for (i = 0; i < nr[nod]; i ++)
if (!fst[v[nod][i]]){
df(v[nod][i], nod, nxt);
if (rsp[nod] < 0)
nxt = 0;
else
nxt = rsp[nod];
}
if (!pus[str])
prv = val[str], pus[str] = 1;
else
prv = 0;
if (rsp[nod] + prv > rsp[str])
rsp[str] = rsp[nod] + prv;
//fprintf(stderr, "la revenire pentru nodul %d este %d\n", str, rsp[str]);
}
int main()
{
freopen("asmax.in", "rt", stdin);
freopen("asmax.out", "wt", stdout);
scanf("%d", &n);
for (i = 1; i <= n; i ++){
scanf("%d", &val[i]);
rsp[i] = -infinit;
}
for (i = 1; i < n; i ++){
scanf("%d%d", &x, &y);
nr[x] ++;
v[x].push_back(y);
nr[y] ++;
v[y].push_back(x);
}
df(1, 0, 0);
mx = -infinit;
for (i = 1; i <= n; i ++)
if (rsp[i] > mx)
mx = rsp[i];
printf("%d\n", mx);
return 0;
}