Pagini recente » Cod sursa (job #1767573) | Cod sursa (job #111185) | Cod sursa (job #1346652) | Cod sursa (job #485918) | Cod sursa (job #1425549)
#include <stdio.h>
#include <vector>
#define NMAX 16001
using namespace std;
int n, cost[NMAX], ans = - 1 << 30, s[NMAX], top, curr, currIndex[NMAX], mustContinue, vis[NMAX];
vector<int> tree[NMAX];
void solve(int start) {
int index;
s[top] = start;
while(top >= 0) {
curr = s[top];
vis[curr] = 1;
if(cost[curr] > ans) ans = cost[curr];
if(!tree[curr].size()) {
--top;
continue;
}
index = currIndex[curr];
mustContinue = 0;
for(; index < tree[curr].size(); ++index, ++currIndex[curr]) {
if(!vis[tree[curr][index]]) {
s[++top] = tree[curr][index];
mustContinue = 1;
break;
}
if(cost[tree[curr][index]] + cost[curr] > cost[curr]) {
cost[curr] += cost[tree[curr][index]];
if(cost[curr] > ans) ans = cost[curr];
}
}
if(mustContinue) continue;
--top;
}
}
int main() {
freopen("asmax.in", "r", stdin);
freopen("asmax.out", "w", stdout);
int x, y, i;
scanf("%d", &n);
for(i = 1; i <= n; ++i) {
scanf("%d", &cost[i]);
}
for(i = 0; i < n - 1; ++i) {
scanf("%d%d", &x, &y);
tree[x].push_back(y);
}
solve(x);
printf("%d", ans);
return 0;
}