Pagini recente » Istoria paginii runda/16_februarie_simulare_oji_2024_clasele_11_12 | Cod sursa (job #1204707) | Cod sursa (job #1876668) | Cod sursa (job #731016) | Cod sursa (job #1439004)
#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];
p = urm[p];
if (s[y] > maxim)
maxim = s[y];
}
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);
}
for (i = 1; i <= n; i++)
if (viz[i] == 0)
dfs(i);
fprintf (out, "%d", maxim);
return 0;
}