Cod sursa(job #278607)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 12 martie 2009 13:38:44
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<stdio.h>
#define max(a,b) (a>b?a:b)

FILE *fin=fopen("asmax.in","r"),
    *fout=fopen("asmax.out","w");

int N,c[16005];
struct nod{int inf;nod* next;};
typedef nod* lista;
lista L[16005];

int smax[16005];
char viz[16005];

void dfs(int nod){
    if(!L[nod]){
        smax[nod]=max(0,c[nod]);
        return;
    }

    for(lista p=L[nod];p;p=p->next)
        if(viz[p->inf]==0){
            viz[p->inf]=1;
            dfs(p->inf);
        }

    smax[nod]=c[nod];
    for(lista p=L[nod];p;p=p->next)
        smax[nod]+=smax[p->inf];

    smax[nod]=max(smax[nod],0);

}

int main(){
    fscanf(fin,"%d",&N);

    int max=-1000000000;
    for(int i=1;i<=N;i++){
        fscanf(fin,"%d",&c[i]);
        max=max(max,c[i]);
    }



    for(int i=1;i<N;i++){
        int x,y;
        fscanf(fin,"%d %d",&x,&y);
        lista aux=new nod;
        aux->inf=x;aux->next=L[y];L[y]=aux;

        aux=new nod;
        aux->inf=y;aux->next=L[x];L[x]=aux;
    }


    if(max<0)
        fprintf(fout,"%d\n",max);
    else{

        viz[1]=1;
        dfs(1);
        max=-1;
        for(int i=1;i<=N;i++)
            max=max(max,smax[i]);
        fprintf(fout,"%d\n",max);
    }

    fclose(fin);
    fclose(fout);
    return 0;




}