Cod sursa(job #1900351)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 3 martie 2017 12:22:04
Problema Asmax Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
#include <vector>
using namespace std;
int n,i,maxi,a,b,j,k,x,y,v[16005],r[16005];
vector <int> p[16005];
vector <int> q[16005];
vector <int> w[16005];
void rec(int poz, int rnd, int str)
{
    int o;
    r[poz]=v[poz];
    q[rnd].push_back(str);
    p[rnd].push_back(poz);
    p[rnd][0]++;
    if(k<rnd) k=rnd;
    for(o=1; o<=w[poz][0]; o++)
    {
        if(r[w[poz][o]]==-1001)
        {
            rec(w[poz][o],rnd+1,poz);
        }
    }
}
int main()
{
    ifstream f("asmax.in");
    ofstream g("asmax.out");
    f>>n;
    maxi=-1001;
    for(i=1; i<=n; i++)
    {
        f>>v[i];
        r[i]=-1001;
        w[i].push_back(0);
        p[i].push_back(0);
        q[i].push_back(0);
    }
    for(i=1; i<n; i++)
    {
        f>>a>>b;
        w[a][0]++;
        w[a].push_back(b);
        w[b][0]++;
        w[b].push_back(a);
    }
    p[1].push_back(1);
    q[1].push_back(0);
    rec(1,1,0);
    for(i=k; i>=2; i--)
    for(j=1; j<=p[i][0]; j++)
    {
        x=p[i][j];
        y=q[i][j];
        r[y]=max(r[y],r[x]+r[y]);
        if(r[y]>=maxi) maxi=r[y];
    }
    g<<maxi<<'\n';
    f.close(); g.close();
    return 0;
}