Pagini recente » Cod sursa (job #2959884) | Cod sursa (job #2107707) | Cod sursa (job #2951659) | Cod sursa (job #1147953) | Cod sursa (job #2500692)
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("asmax.in");
ofstream fout("asmax.out");
const int N=2e8;
int vf[2*N],urm[2*N],lst[N],v[N], n ;
int nr;
bool viz[N];
int best[N];
void adauga(int x, int y)
{
vf[++nr]=y;
urm[nr]=lst[x];
lst[x]=nr;
}
int dfs(int x)
{
viz[x]=true;
for(int p=lst[x];p!=0;p=urm[p])
{
int y=vf[p];
if(!viz[y])
{
dfs(y);
best[x]+=max(0,dfs(y));
}
}
best[x]+=v[x];
return best[x];
}
int main()
{
int n;
fin>>n;
for(int i=1;i<=n;i++)
{
fin>>v[i];
best[i] = 0;
}
for(int i=1;i<=n-1;i++)
{
int x,y;
fin>>x>>y;
adauga(x,y);
adauga(y,x);
}
dfs(1);
int ans=-N;
for(int i=1;i<=n;i++)
{
ans=max(ans,best[i]);
}
fout<<ans;
fin.close();
fout.close();
return 0;
}