Cod sursa(job #2759458)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 17 iunie 2021 22:26:59
Problema Asmax Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <iostream>
#include <fstream>
#include <vector>

#define NMAX 16000 //saispe mii

using namespace std;

ifstream fin ("asmax.in");
ofstream fout ("asmax.out");

vector<int> v[NMAX];
bool viz[NMAX];
int val[NMAX];
int suma[NMAX];

void DFS(int nod){
    viz[nod] = 1; //il marchez ca vizitat

    for(int i = 0; i < v[nod].size(); i++){
        //iau fiecare fiu al lui nod
        //de fapt initial iau fiecare nod cu care are legatura, inclusiv tatal, dar in tata nu mai merg datorita lui viz[]
        int nodV = v[nod][i];

        if( ! viz[ nodV ] ){
            //daca nu a fost inca vizitat, adica nu e tatal in aceasta parcurgere
            DFS(nodV);

            //fac tot ce trebuie pe el
            //dupa care ma folosesc de suma[nodV]
            //care acum e calculata

            suma[nod] = max(suma[nod], suma[nod] + suma[nodV]);

            /*
                Care e echivalentul a:
                if( suma[nodV] > 0 ){
                    suma[nod] += suma[nodV];
                }

                //adica adaug suma cea mai buna care se poate obtine din nodV
                dar doar daca suma cea mai buna care se poate obtine e benefica
                altfel, chiar daca e cea mai buna posibila, tot nu ma ajuta
                ^exprimare proasta :))
            */
        }
    }
}

int main()
{
    int N;
    fin >> N;

    //citesc si initializez suma[] odata cu citirea;
    for(int i = 0; i < N; i++){
        //fin >> val[i];
        /*
            Observ ca nu am, de fapt, nevoie de vectorul val[]
            asa ca o sa fac direct:
        */
        int x;
        fin >> x;

        //suma[i] = val[i];
        suma[i] = x;

        /*
            Mergea si fin >> suma[i];
            dar arata urat si nu se intelege clar!
        */
    }

    for(int i = 0; i < N - 1; i++){ //de N - 1 ori
        int a, b;
        fin >> a >> b;

        ///indexare de la 0 !!!
        a--;
        b--;


        v[a].push_back(b);
        v[b].push_back(a);
    }

    DFS(0); //fixez 0 ca radacina aleatorie
    /*
        De fapt as putea pune orice radacina!
        o sa testez chestia asta cu inca o submisie a sursei
    */


    //acum iau cel mai mare suma[nod] si il afisez
    int rsp = suma[0];
    for(int i = 0; i < N; i++){
        rsp = max(rsp, suma[i]);
    }
    fout << rsp;

    return 0;
}