Pagini recente » Cod sursa (job #2681751) | Cod sursa (job #1654059) | Cod sursa (job #2528796) | Cod sursa (job #827683) | Cod sursa (job #2828821)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("asmax.in");
ofstream g("asmax.out");
int n, suma_maxima;
vector<int>costuri; // valoarea asociata fiecarui varf
vector<vector<int>>vecini; // liste de adiacenta
vector<bool>vizitat; // vector in care sunt marcate varfurile vizitate
int dfs(int nod1)
{
vizitat[nod1] = 1;
int suma_nod1 = costuri[nod1]; // initial, suma maxima a subarborelui cu radacina nod1 este chiar valoarea asociata nodului
for (int i = 0; i < vecini[nod1].size(); i++)
{
int nod2 = vecini[nod1][i];
if (!vizitat[nod2])
{
int sum_nod2 = dfs(nod2); // determin suma maxima a subarborelui ce are ca radacina nod2
if (sum_nod2 > 0) // daca suma subarborelui ce are nod2 ca radacina este pozitiva => o adaug la suma subarborelui ce are nod1 ca radacina
suma_nod1 += sum_nod2;
}
}
if (suma_nod1 > suma_maxima) // verific daca este nevoie sa actualizez suma_maxima
suma_maxima = suma_nod1;
return suma_nod1;
}
int main()
{
f >> n;
costuri.resize(n + 1);
vecini.resize(n + 1);
vizitat.resize(n + 1, 0);
for (int i = 1; i <= n; i++)
f >> costuri[i];
for (int i = 1; i < n; i++)
{
int a, b;
f >> a >> b; // extremitatile unei muchii
vecini[a].push_back(b);
vecini[b].push_back(a);
}
suma_maxima = -999999999;
dfs(1); // incep parcurgerea dintr-un nod oarecare, deoarece graful este conex
g << suma_maxima;
return 0;
}