Pagini recente » Cod sursa (job #3005333) | Cod sursa (job #1225287) | Cod sursa (job #3294218) | Cod sursa (job #388782) | Cod sursa (job #2759459)
#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;
}