Cod sursa(job #1595892)

Utilizator PraetorGrigorosoaia Florin Praetor Data 10 februarie 2016 16:56:53
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<fstream>
#define NRMN 16001// numar maxim noduri

using namespace std;

FILE*in;
ofstream out("asmax.out");

int nr_noduri;
int values[NRMN];
long int BEST[NRMN];
bool visited[NRMN];
int *LA[NRMN];
long int maxim_from_BEST;

void read()
{
    in=fopen("asmax.in", "r");

    fscanf(in, "%d", &nr_noduri);
    for (int i=1; i<=nr_noduri; i++)
    {
        fscanf(in, "%d", &values[i]);

        LA[i]=(int *)realloc(LA[i], sizeof(int));
        LA[i][0]=0;
    }

    for (int i=1; i<nr_noduri; i++)
    {
        int x, y;

        fscanf(in, "%d%d", &x, &y);

        LA[x][0]++;
        LA[x]=(int *)realloc(LA[x], (LA[x][0]+1)*sizeof(int));
        LA[x][LA[x][0]]=y;

        LA[y][0]++;
        LA[y]=(int *)realloc(LA[y], (LA[y][0]+1)*sizeof(int));
        LA[y][LA[y][0]]=x;
    }
}

void DFS(int nod)
{
    visited[nod]=true;

    for (int i=1; i<=LA[nod][0]; i++)
        if (!visited[LA[nod][i]])
            DFS(LA[nod][i]);

    BEST[nod]=values[nod];

    for (int i=1; i<=LA[nod][0]; i++)
        if (BEST[LA[nod][i]] > 0)
            BEST[nod]+=BEST[LA[nod][i]];
}

void find_maxim_from_BEST()
{
    maxim_from_BEST=BEST[1];

    for (int i=2; i<=nr_noduri; i++)
        if (BEST[i] > maxim_from_BEST)
            maxim_from_BEST=BEST[i];
}

void solve()
{
    DFS(1);
    find_maxim_from_BEST();
}

void show()
{
    out<<maxim_from_BEST;
}

int main()
{
    read();
    solve();
    show();

    return 0;
}