Pagini recente » Cod sursa (job #177563) | Istoria paginii runda/hardcore | Istoria paginii runda/newcomers_4 | Cod sursa (job #2425007) | Cod sursa (job #1652289)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("asmax.in");
ofstream out("asmax.out");
const int N = 16003;
int a[N], n;
int nr, lst[N], vf[N], urm[N], sum[N];
bool viz[N];
void adauga( int x, int y )
{
nr++;
vf[nr] = y;
urm[nr] = lst[x];
lst[x] = nr;
}
void dfs( int x )
{
viz[x] = true;
int poz, y;
poz = lst[x];
while( poz != 0 )
{
y = vf[poz];
if ( viz[y] == false )
{
dfs(y);
if ( sum[y] > 0 )
sum[x] += sum[y];
}
poz = urm[poz];
}
if ( sum[x] < 0 )
sum[x] = a[x];
else sum[x] += a[x];
}
int main()
{
int i, x, y;
in >> n;
for ( i = 1; i <= n; i++ )
in >> a[i];
for ( i = 1; i <= n-1; i++ )
{
in >> x >> y;
adauga(x, y);
adauga(y, x);
}
for ( i = 1; i <= n; i++ )
{
if ( viz[i] == false )
dfs(i);
}
int nrm = sum[1];
for ( i = 2; i <= n; i++ )
if ( nrm < sum[i] )
nrm = sum[i];
out << nrm<<'\n';
return 0;
}