Cod sursa(job #2913768)

Utilizator Paul_DobrescuPaul Dobrescu Paul_Dobrescu Data 16 iulie 2022 20:40:41
Problema Asmax Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>

#define ll long long

using namespace std;

ifstream reader("asmax.in");
ofstream writer("asmax.out");

const int inf = 1e9 + 12415;

void dfs (int k, vector <int>& rez, int poz, vector <int>& copac, vector <int>& a)
{
	if(copac[k] == 0)
		return;
	//rez[k] += a[k];
	if(copac[k] != 0)rez[copac[k]] += rez[k];
	dfs(copac[k], rez, poz, copac, a);
}

int main()
{
// #ifndef ONLINE_JUDGE
// 	freopen("input", "r", stdin);
// 	freopen("outputs", "w", stdout);
// #endif
	int n;
	reader >> n;
	vector <int> a(n + 1);
	vector <bool> rad(n + 1, false);
	vector <int> copac(n + 1 , inf);
	for(int i = 1; i <= n; ++i)
		reader >> a[i];
	for(int i = 1; i < n; ++	i)
	{
		int x, y;
		reader >> x >> y;
		rad[x] = true;
		copac[y] = x;
	}
	int poz = -1;
	for(int i = 0; i <= n; ++i)
		if(copac[i] == inf)
		{
			copac[i] = 0;
			poz = i;
		}	
	vector <int> rez(n + 1, 0);
	for(int i = 0; i <= n; ++i)
		rez[i] = a[i];
	for(int i = 1; i <= n; ++i)
	{
		if(!rad[i])
		{
			int ant = -1;
			dfs(i, rez, poz, copac, a);
		}
	}
	//for(int i = 1; i <= n; ++i)
	//	rez[i] -= a[i];
	int maxi = -1e9;
	int cnt = 0;

	for(int i = 1; i <= n; ++i)
	{
		if(copac[i] == poz and rez[i] + a[poz] > maxi)
		{
			maxi = rez[i] + a[poz];
			cnt += rez[i];
		}
	}
	if(cnt + a[poz] > maxi)
		maxi = cnt + a[poz];

	for(int i = 1; i <= n; ++i)
		if(rad[i])
			maxi = max(maxi, rez[i]);

	// for(int i = 1; i <= n; ++i)
	// 	cout << rez[i] << ' ';
	// cout << '\n';
	writer << maxi;
	return 0;
}