Cod sursa(job #201535)

Utilizator plastikDan George Filimon plastik Data 1 august 2008 12:53:12
Problema Asmax Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
// http://infoarena.ro/problema/asmax

#include <cstdio>
#include <cstring>

#include <list>
using namespace std;
const int NMAX = 16001;

int n, m;
struct node {
	int sum;
	list<int> Neighb;
};
node All[NMAX];

void eraseEdge(int parent, int dead) {
	list<int>::iterator li;
	for (li = All[parent].Neighb.begin(); li != All[parent].Neighb.end(); ++ li)
		if (*li == dead) {
			All[parent].Neighb.erase(li);
			break;
		}
}

int main() {
	
	freopen("asmax.in", "r", stdin);
	freopen("asmax.out", "w", stdout);
	
	scanf("%d", &n);
	int i;
	for (i = 0; i < n; ++ i)
		scanf("%d", &All[i].sum);
	int v1, v2;
	for (i = 0; i < n - 1; ++ i) {
		scanf("%d %d", &v1, &v2);
		-- v1, -- v2;
		All[v1].Neighb.push_back(v2);
		All[v2].Neighb.push_back(v1);
	}
	
	m = n - 1;
	int nL, ans = 0;
	do {
		nL = 0;
		for (i = 0; i < n; ++ i)
			if (All[i].Neighb.size() == 1) {
				// printf("%d being erased\n", i + 1);
				++ nL;
				ans = max(ans, All[i].sum);
				if (All[i].sum > 0) {
					All[*(All[i].Neighb.begin())].sum += All[i].sum;
					ans = max(ans, All[*(All[i].Neighb.begin())].sum);
				}
				eraseEdge(*(All[i].Neighb.begin()), i);
				All[i].Neighb.clear();
			}
	} while (nL > 1);
	
	printf("%d\n", ans);
		
	return 0;
}