Cod sursa(job #166150)

Utilizator vlad.maneaVlad Manea vlad.manea Data 27 martie 2008 15:15:53
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.h>
#include <stdlib.h>

#define nmax 16384
#define infinit 2147000000

int N;

int V[nmax], *G[nmax], GDA[nmax], viz[nmax];

void read()
{
	int i, x, y;

	freopen("asmax.in", "r", stdin);

	scanf("%d", &N);

	for (i = 1; i <= N; ++i)
		scanf("%d", &V[i]);

	for (i = 1; i <= N; ++i)
	{
		G[i] = (int *)realloc(G[i], sizeof(int));
		G[i][0] = 0;
	}

	for (i = 1; i < N; ++i)
	{
		scanf("%d%d", &x, &y);
		++G[x][0];
		G[x] = (int *)realloc(G[x], (1+G[x][0]) * sizeof(int));
		G[x][G[x][0]] = y;

		++G[y][0];
		G[y] = (int *)realloc(G[y], (1+G[y][0]) * sizeof(int));
		G[y][G[y][0]] = x;
	}
}

void parcour(int n)
{
	int i;

	viz[n] = 1;

	for (i = 1; i <= G[n][0]; ++i)
		if (!viz[G[n][i]])
			parcour(G[n][i]);

	for (i = 1; i <= G[n][0]; ++i)
		if (GDA[G[n][i]] > 0)
			GDA[n] += GDA[G[n][i]];

	GDA[n] += V[n];
}

void write()
{
	freopen("asmax.out", "w", stdout);

	int i, m = -infinit;

	for (i = 1; i <= N; ++i)
		if (GDA[i] > m)
			m = GDA[i];

	printf("%d\n", m);
}

int main()
{
	read();

	parcour(1);

	write();

	return 0;
}