Cod sursa(job #13873)

Utilizator vmaneavmanea vmanea Data 7 februarie 2007 17:46:24
Problema Asmax Scor 60
Compilator c Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#include <stdlib.h>
#define infinit 2000000000
#define nm 16555

int N, max, min, i, s, a, b, x;
int V[nm], *d[nm], viz[nm];

int dfs(int);

int main(void)

{
	freopen("asmax.in", "r", stdin);
	freopen("asmax.out", "w", stdout);

	for (scanf("%d", &N), max = -(min = infinit), i = 1; i <= N; ++i)
	{
		scanf("%d", &V[i]);
		if (V[i] > max) max = V[i];
		if (V[i] < min) min = V[i];
		s+=V[i];
	}

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

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

		d[a][d[a][0]] = b;
		d[b][d[b][0]] = a;
	}

	if (max <= 0)
	{
		printf("%d\n", max);
		return 0;
	}

	if (min >= 0)
	{
		printf("%d\n", s);
		return 0;
	}

	for (i = 1; i <= N && V[i] < 0; ++i);

	x = dfs(i);
	printf("%d\n", x);

	return 0;

}

int dfs(int x)
{
	int S = V[x], i;

	for (i = viz[x] = 1; i <= d[x][0]; ++i)
		if (!viz[d[x][i]])
			S += (s = dfs(d[x][i]));

	if (S > 0) return S;
	return 0;
}