Pagini recente » Cod sursa (job #20399) | Cod sursa (job #416808) | Cod sursa (job #1245215) | Cod sursa (job #2074171) | Cod sursa (job #1246766)
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
long n,val[16005],d[16005],maxi,k,R,s[20000],u;
bool viz[16005];
vector<long> v[16005];
ifstream in("asmax.in");
ofstream out("asmax.out");
long dinamica(long i);
int main()
{
in>>n;
long i,a,b,p;
for(i=1;i<=n;i++)
{
in>>val[i];
v[i].push_back(0);
}
for(i=1;i<n;i++)
{
in>>a>>b;
v[b].push_back(a);
v[a].push_back(b);
v[a][0]++;
v[b][0]++;
}
for(i=1;i<=n;i++) if(v[i][0]>maxi) maxi=v[i][0],k=i;
dinamica(k);
if(R==0) {out<<-2<<'\n'; return 0;}
out<<R<<'\n';
}
long dinamica(long i)
{
s[++u]=i;
long j,vv,su;
bool f;
while(u)
{
su=s[u];
viz[su]=1;
f=1;
for(j=1;j<=v[su][0];j++)
{
vv=v[su][j];
if(!viz[vv])
s[++u]=vv,f=0,viz[vv]=1;
}
if(f==1)
{
d[su]=val[su];
for(j=1;j<=v[su][0];j++)
{
vv=v[su][j];
d[su]+=d[vv];
}
if(d[su]<0) d[su]=0;
else
{
if(d[su]>R) R=d[su];
}
u--;
}
}
}