Pagini recente » Cod sursa (job #1839651) | Cod sursa (job #2533641) | Cod sursa (job #236080) | Cod sursa (job #798724) | Cod sursa (job #2500697)
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("asmax.in");
ofstream fout("asmax.out");
const int N = 16001, INF = 1000001;
int vf[2 * N], urm[2 * N], lst[N], v[N], n, nr, smax = -INF; // nr = pozitia curenta
bool viz[N];
void adauga(int x, int y)
{
vf[++nr]=y;
urm[nr]=lst[x];
lst[x]=nr;
}
int dfs(int x) {
viz[x] = true;
int p = lst[x], y, d, s = v[x];
while (p != 0) {
y = vf[p];
if (!viz[y]) if ((d = dfs(y)) >= 0) s += d;
p = urm[p];
}
if (s > smax) smax = s;
return s;
}
int main()
{
int n;
fin>>n;
for(int i=1;i<=n;i++)
{
fin>>v[i];
}
for(int i=1;i<=n-1;i++)
{
int x,y;
fin>>x>>y;
adauga(x,y);
adauga(y,x);
}
dfs(1);
fout<<smax;
fin.close();
fout.close();
return 0;
}