Cod sursa(job #1604807)

Utilizator krityxAdrian Buzea krityx Data 18 februarie 2016 16:44:12
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

vector<int> valoare, mv;
vector<vector<int>> G;
vector<bool> viz;
//void bfs()
//{
//	queue<int> q;
//	q.push(1);
//	tata[1] = -1;
//	while (!q.empty())
//	{
//		int nod = q.front();
//		q.pop();
//		for (vector<int>::iterator it = G[nod].begin(); it != G[nod].end(); it++)
//		{
//			if (!tata[*it])
//			{
//				q.push(*it);
//				tata[*it] = nod;
//			}
//		}
//	}
//}

int dfs(int nod)
{
	int maxChildren = 0;
	for (vector<int>::iterator it = G[nod].begin(); it != G[nod].end(); it++)
	{
		if (!viz[*it])
		{
			viz[*it] = true;
			int val = dfs(*it);
			if (val > 0)
			{
				maxChildren += val;
			}
		}
	}
	mv[nod] = max(valoare[nod], valoare[nod] + maxChildren);
	return mv[nod];
}



int main()
{
	int N, i, x, y, z;
	
	ifstream f("asmax.in");
	f >> N;
	valoare.resize(N + 1);
	viz.resize(N + 1);
	mv.resize(N + 1);
	G.resize(N + 1);
	for (i = 1; i <= N; i++)
	{
		f >> valoare[i];
	}
	for (i = 1; i <= N - 1; i++)
	{
		f >> x >> y;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	f.close();

	viz[1] = true;
	dfs(1);

	int max = mv[1];

	for (i = 2; i <= N; i++)
	{
		if (mv[i] > max)
		{
			max = mv[i];
		}
	}
	ofstream g("asmax.out");
	g << max;
	g.close();
	//bfs();

	
	return 0;
}