Cod sursa(job #1363247)

Utilizator PescaruVictorPescaru Victor PescaruVictor Data 26 februarie 2015 20:22:37
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <fstream>
#include <vector>
#define NMAX 16009
using namespace std;

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

int n;
int nivmax;
int maxim;
int v[NMAX];
int M[NMAX];
int tata[NMAX];
vector <int> L[NMAX], niv[NMAX];

void citire ();
void nivel ();
void pd ();

int main()
{
    citire();
    nivel();
    pd();
    return 0;
}

void citire ()
{
    int i;
    int a, b;
    fscanf(fin, "%d\n", &n);
    fscanf(fin, "%d ", &M[1]);
    maxim=M[1];
    for(i=2; i<=n; ++i)
    {
        fscanf(fin, "%d ", &M[i]);
        if(maxim<M[i])
            maxim=M[i];
    }
    for(i=1; i<n; ++i)
    {
        fscanf(fin, "%d %d\n", &a, &b);
        L[a].push_back(b);
        L[b].push_back(a);
    }
}

void nivel ()
{
    int  j, k, total=1, vf;
    /*int crt=0; urm=1;
    int primcrt=ultimcrt=0, ultimurm;
    c[crt][++ultimcrt]=1;
    niv[1].push_back(1);
    for(nivmax=1; total<=n; ++nivmax)
    {
        ultimurm=primcrt=0;
        while(primcrt<=ultimcrt)
        {
            vf=c[crt][++primcrt];
            for(i=1; i<=L[vf].size(); ++i)
                if(tata[vf]!=L[vf][i])
                {
                    tata[L[vf][i]]=vf;
                    c[urm][++ultimurm]=L[vf][i];
                    niv[nivmax].push_back(L[vf][i]);
                    ++total;
                }
        }
        crt=1-crt;
        urm=1-urm;
        ultimcrt=ultimurm;

    }*/
    niv[1].push_back(1);
    for(nivmax=1; total<n; ++nivmax)
    {
        for(j=0; j<niv[nivmax].size(); ++j)
        {
            vf=niv[nivmax][j];
            for(k=0; k<L[vf].size(); ++k)
                if(tata[vf]!=L[vf][k])
                {
                    tata[L[vf][k]]=vf;
                    niv[nivmax+1].push_back(L[vf][k]);
                    ++total;
                }
        }
    }
}


void pd ()
{
    int i, j;
    //parcurg de la ultimul nivel

    for(i=nivmax; i>=2; --i)
    {
        for(j=0; j<niv[i].size(); ++j)
            {
                M[tata[niv[i][j]]]=max( M[tata[niv[i][j]]], M[niv[i][j]]+M[tata[niv[i][j]]]);
                if(maxim<M[tata[niv[i][j]]])
                    maxim=M[tata[niv[i][j]]];
            }
    }
    fprintf(fout, "%d\n", maxim);

}