Cod sursa(job #201537)

Utilizator plastikDan George Filimon plastik Data 1 august 2008 13:01:19
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
// http://infoarena.ro/problema/asmax

#include <cstdio>
#include <cstring>
#include <climits>

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

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, ans = MINF;
	for (i = 0; i < n; ++ i) {
		scanf("%d", &All[i].sum);
		ans = max(ans, 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 = n;
	do {
		//printf("Dude...\n");
		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;
}