Cod sursa(job #1556619)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 25 decembrie 2015 15:06:43
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<cstdio>
#include<vector>
using namespace std;
vector<int> g[16001],niv[16001];
int v[16001],vc[16001],nivmax=1,sol[16001];
void dfs(int nod,int nivel){
    int i,a=g[nod].size();
    for(i=0;i<a;i++)
        if(vc[g[nod][i]]==0){
            vc[g[nod][i]]=1;
            niv[nivel+1].push_back(g[nod][i]);
            if(nivel+1>nivmax)
                nivmax=nivel+1;
            dfs(g[nod][i],nivel+1);
        }
}
int main (){
    freopen("asmax.in","r",stdin);
    freopen("asmax.out","w",stdout);
    int n,i,a,b,j,k,maxi=-1000000000;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&v[i]);
    for(i=1;i<=n-1;i++){
        scanf("%d%d",&a,&b);
        g[a].push_back(b);
        g[b].push_back(a);
    }
    niv[1].push_back(1);
    vc[1]=1;
    dfs(1,1);
    a=niv[nivmax].size();
    for(i=0;i<a;i++){
        sol[niv[nivmax][i]]=v[niv[nivmax][i]];
        if(sol[niv[nivmax][i]]>maxi)
            maxi=sol[niv[nivmax][i]];
    }
    for(i=nivmax-1;i>=1;i--){
        a=niv[i].size();
        for(j=0;j<a;j++){
            sol[niv[i][j]]=v[niv[i][j]];
            b=g[niv[i][j]].size();
            for(k=0;k<b;k++)
                if(sol[g[niv[i][j]][k]]>0)
                    sol[niv[i][j]]+=sol[g[niv[i][j]][k]];
            if(sol[niv[i][j]]>maxi)
                maxi=sol[niv[i][j]];
        }
    }
    printf("%d",maxi);
    return 0;
}