Pagini recente » Cod sursa (job #3241268) | Cod sursa (job #1897503) | Cod sursa (job #474183) | Cod sursa (job #373146) | Cod sursa (job #1140826)
#include <fstream>
#include <vector>
using namespace std;
#define NMax 16005
#define inf 2100000000
ifstream f("asmax.in");
ofstream g("asmax.out");
int n,val[NMax];
vector<int> v[NMax];
int ordine[NMax],nrord[NMax],viz[NMax];
int nr=0;
long long sum[NMax];
void DFS(int s)
{
viz[s]=1;
for(int i=0;i<v[s].size();i++) if(!viz[v[s].at(i)]) DFS(v[s].at(i));
ordine[++nr]=s;
nrord[s]=nr;
}
long long dinamic()
{
int i,j,s;
long long sumx=-inf;
for(i=1;i<=n;i++)
{
s=ordine[i];
sum[s]=(long long)val[s];
for(j=0;j<v[s].size();j++) if(nrord[s]>nrord[v[s].at(j)])
if(sum[v[s].at(j)]>0) sum[s]+=sum[v[s].at(j)];
if(sumx<sum[s]) sumx=sum[s];
}
return sumx;
}
int main()
{
int i,a,b;
f>>n;
for(i=1;i<=n;i++) f>>val[i];
for(i=1;i<n;i++)
{
f>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
DFS(1);
g<<dinamic()<<"\n";
//for(i=1;i<=n;i++) g<<ordine[i]<<" ";
f.close();
g.close();
return 0;
}