Cod sursa(job #135039)

Utilizator andrei.12Andrei Parvu andrei.12 Data 12 februarie 2008 20:28:57
Problema Asmax Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<stdio.h>
#include<vector>

using namespace std;

#define infinit 0x3f3f3f3f
#define lg 16005

int n, i, rsp[lg], fst[lg], val[lg], nr[lg], mx, x, y, pus[lg];
vector<int> v[lg];
void df(int nod, int str, int s){
	int i, nxt, prv;
	
	fst[nod] = 1;
	
	if (s + val[nod] > rsp[nod])
		rsp[nod] = s + val[nod];
	//fprintf(stderr, "la intrare pentru nodul %d este %d\n", nod, rsp[nod]);
	if (rsp[nod] < 0)
		nxt = 0;
	else
		nxt = rsp[nod], pus[nod] = 1;
	
	for (i = 0; i < nr[nod]; i ++)
		if (!fst[v[nod][i]]){
			df(v[nod][i], nod, nxt);
			if (rsp[nod] < 0)
				nxt = 0;
			else
				nxt = rsp[nod];
		}
	
	if (!pus[str])
		prv = val[str], pus[str] = 1;
	else 
		prv = 0;
	
	if (rsp[nod] + prv > rsp[str])
		rsp[str] = rsp[nod] + prv;
	//fprintf(stderr, "la revenire pentru nodul %d este %d\n", str, rsp[str]);
}
int main()
{
	freopen("asmax.in", "rt", stdin);
	freopen("asmax.out", "wt", stdout);
	
	scanf("%d", &n);
	for (i = 1; i <= n; i ++){
		scanf("%d", &val[i]);
		rsp[i] = -infinit;
	}
	for (i = 1; i < n; i ++){
		scanf("%d%d", &x, &y);
		
		nr[x] ++;
		v[x].push_back(y);
		
		nr[y] ++;
		v[y].push_back(x);
	}
	
	df(1, 0, 0);
	
	mx = -infinit;
	for (i = 1; i <= n; i ++)
		if (rsp[i] > mx)
			mx = rsp[i];
	
	printf("%d\n", mx);
	
	return 0;
}