Pagini recente » Cod sursa (job #842503) | Cod sursa (job #2516396) | Cod sursa (job #639992) | Cod sursa (job #709525) | Cod sursa (job #30948)
Cod sursa(job #30948)
using namespace std;
#include <cstdio>
#include <cassert>
#include <string>
#define FIN "asmax.in"
#define FOUT "asmax.out"
#define NMAX 16001
int N, nf[NMAX], *f[NMAX], s[NMAX], v[NMAX];
int *fi[NMAX], nfi[NMAX], viz[NMAX], iter;
void citire ()
{
int i, x, y;
freopen (FIN, "rt", stdin);
freopen (FOUT, "wt", stdout);
scanf ("%d", &N);
for (i = 1; i <= N; ++ i)
scanf ("%d", &v[i]);
for (i = 1; i <= N; ++ i)
{
scanf ("%d%d", &x, &y);
++ nf[x];
++ nf[y];
}
for (i = 1; i <= N; ++ i)
{
f[i] = new int [nf[i] + 1];
fi[i] = new int [nf[i] + 1];
nf[i] = 0;
}
fseek (stdin, 0, SEEK_SET);
scanf ("%d", &N);
for (i = 1; i <= N; ++ i)
scanf ("%d", &v[i]);
for (i = 1; i <= N; ++ i)
{
scanf ("%d%d", &x, &y);
f[x][++nf[x]] = y;
f[y][++nf[y]] = x;
}
}
void df (int i)
{
int j;
for (j = 1; j <= nfi[i]; ++ j)
df (fi[i][j]);
if (!nfi[i])
s[i] = v[i];
else
{
s[i] = v[i];
for (j = 1; j <= nfi[i]; ++ j)
if (s[fi[i][j]] > 0)
s[i] += s[fi[i][j]];
}
}
void root (int r)
{
int i;
viz[r] = iter;
for (i = 1; i <= nf[r]; ++ i)
if (viz[f[r][i]] != iter)
{
fi[r][++nfi[r]] = f[r][i];
viz[f[r][i]] = iter;
root (f[r][i]);
}
}
void solve ()
{
int max = 0;
for (int i = 1; i <= N; ++ i)
{
memset (s, 0, sizeof (s));
memset (nfi, 0, sizeof (nfi));
++ iter;
root (i);
/*for (int j = 1; j <= N; ++ j)
{
for (int k = 1; k <= nfi[j]; ++ k)
fprintf (stderr, "%d ", fi[j][k]);
if (nfi[j])
fprintf (stderr, " %d\n", j);
}
fprintf (stderr, "\n\n");*/
df (i);
for (int i = 1; i <= N; ++ i)
if (s[i] > max)
max = s[i];
}
printf ("%d\n", max);
}
int
main ()
{
citire ();
solve ();
return 0;
}