Mai intai trebuie sa te autentifici.
Cod sursa(job #1439010)
Utilizator | Data | 21 mai 2015 11:58:18 | |
---|---|---|---|
Problema | Asmax | Scor | 20 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.08 kb |
#include<stdio.h>
using namespace std;
const int N = 16001;
int v[N], nr = 0, vf[2 * N], lst[N], urm[2 * N], s[N], maxim = -10000000, sumtotal;
bool viz[N];
void adauga(int x, int y)
{
nr++;
vf[nr] = y;
urm[nr] = lst[x];
lst[x] = nr;
}
void dfs (int x)
{
int p, y;
s[x] = v[x];
p = lst[x];
viz[x] = true;
while (p != 0)
{
y = vf[p];
if (viz[y] == false)
{
dfs(y);
s[x] += s[y];
if (s[y] > maxim)
maxim = s[y];
}
p = urm[p];
}
if (sumtotal - s[x] > maxim)
maxim = sumtotal - s[x];
}
int main ()
{
FILE *in, *out;
in = fopen ("asmax.in", "r");
out = fopen ("asmax.out", "w");
int n;
fscanf (in, "%d", &n);
int i;
for (i = 1; i <= n; i++)
{
fscanf (in, "%d", &v[i]);
sumtotal += v[i];
}
int x, y;
for (i = 1; i <= n; i++)
{
fscanf (in, "%d%d", &x, &y);
adauga(x, y);
adauga(y, x);
}
maxim = sumtotal;
dfs(1);
fprintf (out, "%d", maxim);
return 0;
}