Cod sursa(job #2828821)

Utilizator lolotbogdanLolot Stefan-Bogdan lolotbogdan Data 8 ianuarie 2022 00:14:58
Problema Asmax Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#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;
}