Pagini recente » Cod sursa (job #629625) | Istoria paginii runda/bun_simulareoji_2007_11-12 | Istoria paginii runda/hertzalaiiii/clasament | Cod sursa (job #1425585) | Cod sursa (job #1425561)
#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], tata[NMAX];
vector<int> tree[NMAX];
void solve(int start) {
int index;
s[top] = start;
while(top >= 0) {
curr = s[top];
if(cost[curr] > ans) ans = cost[curr];
index = currIndex[curr];
mustContinue = 0;
for(; index < tree[curr].size(); ++index, ++currIndex[curr]) {
if(!vis[tree[curr][index]] && tree[curr][index] != tata[curr]) {
tata[tree[curr][index]] = curr;
s[++top] = tree[curr][index];
mustContinue = 1;
break;
}
if(cost[tree[curr][index]] + cost[curr] > cost[curr] && tree[curr][index] != tata[curr]) {
cost[curr] += cost[tree[curr][index]];
if(cost[curr] > ans) ans = cost[curr];
}
}
if(mustContinue) continue;
--top;
vis[curr] = 1;
}
}
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);
tree[y].push_back(x);
}
solve(x);
printf("%d", ans);
return 0;
}