Pagini recente » Cod sursa (job #1559038) | Cod sursa (job #2405639) | Diferente pentru problema/patrol intre reviziile 28 si 29 | Monitorul de evaluare | Cod sursa (job #1800202)
#include <cstdio>
#define MAXN 100000
int r, n, lista[MAXN+1], nxt[2*MAXN+1], val[2*MAXN+1], cost[MAXN+1], best[MAXN+1];
bool viz[MAXN+1];
int ans;
inline int maxim(int a, int b){
return (a > b ? a : b);
}
inline void adauga(int x, int y)
{
val[++r] = y;
nxt[r] = lista[x];
lista[x] = r;
}
void dfs(int nod)
{
int p;
viz[nod] = 1;
p = lista[nod];
best[nod] = cost[nod];
while(p)
{
if(!viz[val[p]]){
dfs(val[p]);
if(best[val[p]] > 0)
best[nod] += best[val[p]];
}
p = nxt[p];
}
ans = maxim(ans, best[nod]);
}
int main()
{
freopen("asmax.in", "r", stdin);
freopen("asmax.out", "w", stdout);
int i, x, y;
scanf("%d", &n);
for(i=1; i<=n; ++i){
scanf("%d", &cost[i]);
ans += cost[i];
}
for(i=1; i<n; ++i)
{
scanf("%d%d", &x, &y);
adauga(x, y);
adauga(y, x);
}
dfs(1);
printf("%d", ans);
return 0;
}