Pagini recente » Solutii preONI 2006 - Runda a 3-a | Cod sursa (job #1271226) | Cod sursa (job #1419135) | Cod sursa (job #1281980) | Cod sursa (job #31039)
Cod sursa(job #31039)
using namespace std;
#include <cstdio>
#include <cassert>
#include <string>
#define FIN "asmax.in"
#define FOUT "asmax.out"
#define NMAX 16001
#define INF 0x3f3f3f3f
int N, nf[NMAX], *f[NMAX], s[NMAX], v[NMAX], viz[NMAX], iter, x, y;
char sir[16];
void get ()
{
int l = strlen (sir), i = l - 1, ct = 1;
x = y = 0;
while (sir[i] != ' ')
{
x += (sir[i] - '0') * ct;
ct *= 10;
-- i;
}
-- i;
ct = 1;
while (i >= 0)
{
y += (sir[i] - '0') * ct;
ct *= 10;
-- i;
}
}
void read ()
{
int i;
freopen (FIN, "rt", stdin);
freopen (FOUT, "wt", stdout);
scanf ("%d\n", &N);
for (i = 1; i <= N; ++ i)
scanf ("%d ", &v[i]);
scanf ("\n");
for (i = 1; i < N; ++ i)
{
gets (sir);
get ();
++ nf[x];
++ nf[y];
}
for (i = 1; i <= N; ++ i)
{
f[i] = new int [nf[i] + 1];
nf[i] = 0;
}
fseek (stdin, 0, SEEK_SET);
scanf ("%d\n", &N);
for (i = 1; i <= N; ++ i)
scanf ("%d ", &v[i]);
scanf ("\n");
for (i = 1; i < N; ++ i)
{
gets (sir);
get ();
f[x][++nf[x]] = y;
f[y][++nf[y]] = x;
}
}
void df (int i)
{
int j;
bool verif = false;
viz[i] = iter;
s[i] = v[i];
for (j = 1; j <= nf[i]; ++ j)
if (viz[f[i][j]] != iter)
{
df (f[i][j]);
if (s[f[i][j]] > 0)
s[i] += s[f[i][j]];
verif = true;
}
if (!verif)
s[i] = v[i];
}
void solve ()
{
int max = -INF;
for (int i = 1; i <= N; ++ i)
{
++ iter;
df (i);
if (s[i] > max)
max = s[i];
}
printf ("%d\n", max);
}
int
main ()
{
read ();
solve ();
return 0;
}