Cod sursa(job #1425549)

Utilizator AplayLazar Laurentiu Aplay Data 27 aprilie 2015 17:23:50
Problema Asmax Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#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;
}