Cod sursa(job #1452925)

Utilizator allexx2200Atanasiu Alexandru-Marian allexx2200 Data 22 iunie 2015 12:45:44
Problema Asmax Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <stdio.h>
#include <list>
#include <climits>

/* Nume fisiere intrare/iesire */
#define FIN  "asmax.in"
#define FOUT "asmax.out"

#define MIN(a,b) ((a<b)?(a):(b))
#define MAX(a,b) ((a>b)?(a):(b))

/* Numar maxim de intrari */
#define NMAX 16001

/* fisiere */
FILE *in, *out;

/* numarul de noduri */
int N;

/* arbore reprezentat prin liste de adiacenta */
std::list<int> graph[NMAX];

/* valorile din noduri */
long values[NMAX];

/* vector de dinamica */
long dinamica[NMAX];

bool invalid[NMAX];

void DFS(int node){
    if(graph[node].empty()){
        dinamica[node] = values[node];
        return;
    }

    int sum = 0;
    for(std::list<int>::iterator it = graph[node].begin(); it != graph[node].end(); ++it){
        int neigh = *it;
        DFS(neigh);
        if(dinamica[neigh] + sum > dinamica[node]) sum += dinamica[neigh];
    }

    if(sum < 0) dinamica[node] = values[node];
    else dinamica[node] = values[node] + sum;
}

long DFS_max(int node){
    if(graph[node].empty()){
        return dinamica[node];
    }

    int m = LONG_MIN;
    for(std::list<int>::iterator it = graph[node].begin(); it != graph[node].end(); ++it){
        int neigh = *it;
        int v = DFS_max(neigh);
        if(m < v) m = v;
    }
    return m;
}

void solve(){
    for(int i=1; i < N; i++) dinamica[i] = LONG_MIN/2;
    DFS(1);

    for(int i=1; i <= N; i++){
        printf("%li ", dinamica[i]);
    }

    //int result = DFS_max(1);
    //dinamica[1] = result;
}

int main(){
    /* deschidere fisiere */
    in = fopen(FIN, "rt");
    out = fopen(FOUT, "wt");
    if(!in || !out) return 1;

    fscanf(in, "%d", &N);
    for(int i=1; i <= N; i++) fscanf(in, "%li", &values[i]);

    for(int i=1; i < N; i++){
        int a,b;
        fscanf(in, "%d%d", &a, &b);

        int s = MIN(a,b);
        int d = MAX(a,b);
        graph[s].push_back(d);
    }

    solve();

    fprintf(out, "%li", dinamica[1]);

    /* inchidere fisiere */
    fclose(in);
    fclose(out);
    return 0;
}