Cod sursa(job #390343)

Utilizator andreidragusAndrei Dragus andreidragus Data 3 februarie 2010 16:13:10
Problema Asmax Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.h>
#include <iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<deque>

#define ll long long
#define N (20000)

using namespace std;

bool viz[N];
int val[N];
int ans[N];

vector<int> e[N];
int n;

void dfs(int cur)
{
    if (!viz[cur])
    {
	viz[cur] = true;

	int s = 0;
	for (int i = 0; i < e[cur].size(); i++)
	{
	    if (!viz[e[cur][i]])
	    {
		dfs(e[cur][i]);
		s += ans[e[cur][i]];
	    }
	}


	ans[cur] = max(0, max(val[cur], val[cur] + s));

    }
}

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

    cin >> n;

    for (int i = 0; i < n; i++)
    {
	cin >> val[i];
    }

    for (int i = 0; i < n - 1; i++)
    {
	int u, v;
	cin >> u >> v;
	u--;
	v--;
	e[u].push_back(v);
	e[v].push_back(u);

    }

    dfs(0);

    int pos = 0;
    for (int i = 0; i < n; i++)
	if (val[i] > 0) pos++;

    int m = val[0];

    if (pos == 0)
    {

	for (int i = 0; i < n; i++)
	{
	    m = max(val[i], m);
	}
    } else
    {

	for (int i = 0; i < n; i++)
	{
	    m = max(val[i], max(m, ans[i]));
	}
    }
    printf("%d\n", m);

    return 0;
}