Cod sursa(job #50454)

Utilizator varuvasiTofan Vasile varuvasi Data 7 aprilie 2007 19:03:11
Problema Asmax Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>
#define FOR(i, a, b) for (i = (a); i <= (b); i++)
#define MaxN 16001
#define INF 10000001

int N;
int asmax[MaxN], v[MaxN], sel[MaxN];

struct NOD {
    int vf;
    NOD* next;
};
typedef NOD* PNOD;
PNOD L[MaxN];
    
void df(int varf)
{
    sel[varf] = 1;
    
    asmax[varf] = v[varf];
    
    for (PNOD p = L[varf]; p; p = p->next)
        if (!sel[p->vf])
        {
			df(p->vf);
			if (asmax[varf] < asmax[varf] + asmax[p->vf])
				asmax[varf] = asmax[varf] + asmax[p->vf];
        }
    
    if (asmax[varf] < 0) asmax[varf] = 0;
}

void Add(int i, int j)
{
    PNOD p = new NOD;
    p->vf = j;
    p->next = L[i];
    L[i] = p;
}    

int main()
{
    int i, v1, v2;
    FILE *fin = fopen("asmax.in", "rt");
    fscanf(fin, "%d", &N);
    FOR(i, 1, N) 
        fscanf(fin, "%d", &v[i]);
        
    FOR(i, 1, N-1)
    {
        fscanf(fin, "%d %d", &v1, &v2);
        Add(v1, v2); Add(v2, v1);
    }    
    fclose(fin);
    
    FOR(i, 1, N) asmax[i] = -INF;
    df(1);
    
    int maxim = -INF;
    FOR(i, 1, N)
        if (v[i] > maxim) maxim = v[i];
    FOR(i, 1, N)
        if (asmax[i] > maxim) maxim = asmax[i];
    
    FILE *fout = fopen("asmax.out", "wt");
    fprintf(fout, "%d", maxim);
    fclose(fout);
    return 0;
}