Cod sursa(job #1916133)

Utilizator delia_ioanaCeapa Delia Ioana delia_ioana Data 9 martie 2017 01:46:20
Problema Asmax Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <stdio.h>
#include <iostream>
#include <vector>
#include <climits>
#include <math.h>
#include <stdlib.h>

using namespace std;  

int max_sum = 0;

int dfs(vector<vector<int> > &connections, vector<int> &vals, vector<int> &max_from_node, vector<bool> &visited, int curr_node) {
	if (visited[curr_node])
		return 0;

	visited[curr_node] = true;

	if (connections[curr_node].empty())
		return vals[curr_node];

	bool vis = false;

	for (int i = 0; i < connections[curr_node].size(); i ++) {
		if (!visited[connections[curr_node][i]]) {
			vis = true;
			int next_node = dfs(connections, vals, max_from_node, visited, connections[curr_node][i]);
			if (next_node > 0)
				max_from_node[curr_node] += next_node;
		}
	}

	if (!vis) {
		return vals[curr_node];
	}

	return max_from_node[curr_node];
}

int main() {
	  freopen("asmax.in", "r", stdin);
	  freopen("asmax.out", "w", stdout);

	  int n;
	  scanf("%d", &n);

	  vector<int> vals(n);

	  for (int i = 0; i < n; i ++) {
	  	scanf("%d", &vals[i]);
	  }

	  vector<vector<int> > connections(n);
	  vector<bool> visited(n, false);
	  vector<int> max_from_node = vals;

	  for (int i = 0; i < n - 1; i ++) {
	  	int a, b;
	  	scanf("%d %d", &a, &b);

	  	connections[a - 1].push_back(b - 1);
	  	connections[b - 1].push_back(a - 1);
	  }

	  for (int i = 0; i < n; i ++) {
	  	max_sum = max(max_sum, dfs(connections, vals, max_from_node, visited, i));
	  }

	  printf("%d\n", max_sum);

	  return 0;
}