Cod sursa(job #785657)

Utilizator crushackPopescu Silviu crushack Data 9 septembrie 2012 15:44:33
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
#define NMax 16010
using namespace std;

const char IN[]="asmax.in",OUT[]="asmax.out";

int N;
int v[NMax] , T[NMax], D[NMax];
vector<int> ad[NMax];

void dfs(int x,int p=0)
{
	T[x]=v[x];
	for (int i=0;i<(int)ad[x].size();++i) if (ad[x][i]!=p)
		dfs(ad[x][i],x),
		T[x]+=max(0,T[ad[x][i]]);
}

void dfs2(int x,int p=0)
{
	D[x]=max(0,D[p]) + max(0,T[p]) - max(0,T[x]);
	for (int i=0;i<(int)ad[x].size();++i) if (ad[x][i]!=p)
		dfs2(ad[x][i],x);
}

int main()
{
	int i,x,y;
	freopen(IN,"r",stdin);
	scanf("%d",&N);
	for (i=1;i<=N;++i) scanf("%d",v+i);
	for (i=1;i<N;++i)
		scanf("%d%d",&x,&y),
		ad[x].push_back(y),
		ad[y].push_back(x);

	dfs(1);dfs2(1);

	int Rez=D[1]+T[1];
	for (i=1;i<=N;++i) if (D[i]+T[i]>Rez)
		Rez=D[i]+T[i];

	freopen(OUT,"w",stdout);
	printf("%d\n",Rez);
	fclose(stdout);

	return 0;
}