Pagini recente » Cod sursa (job #1822770) | Borderou de evaluare (job #3123800) | Cod sursa (job #594371) | Cod sursa (job #2100470) | Cod sursa (job #1038844)
#include<fstream>
using namespace std;
ifstream f("asmax.in");
ofstream g("asmax.out");
struct nod
{
int nr;
nod *adr;
};
nod *a[16010];
int n,c[16010],ord[16010],cmax,ok[16010],j;
void citire()
{
f>>n;
for(int i=1;i<=n;i++)
f>>c[i];
for(int i=1;i<n;i++)
{
int x,y;
f>>x>>y;
nod *p=new nod;
p->nr=y;
p->adr=a[x];
a[x]=p;
p=new nod;
p->nr=x;
p->adr=a[y];
a[y]=p;
}
}
void parcurgere(int x,int i)
{
if(i<=n)
{
ok[x]=1;
for(nod *p=a[x];p!=NULL;p=p->adr)
{
if(ok[p->nr]==0)
{
ord[++j]=p->nr;
ok[p->nr]=1;
}
}
parcurgere(ord[i+1],i+1);
}
}
void rezolvare(int x)
{
int maxim=-1010;
int s=0;
int r=ord[x];
if(x>0)
{
for(nod *p=a[r];p!=NULL;p=p->adr)
{
if(ok[p->nr]==0)
{
if(c[p->nr]>0)
s+=c[p->nr];
if(c[p->nr]>maxim)
maxim=c[p->nr];
}
}
if(s>0)
maxim=s;
if(c[r]+maxim>c[r])
c[r]+=maxim;
}
}
int main()
{
citire();
ord[1]=1;
j=1;
parcurgere(1,1);
cmax=-1010;
for(int i=n;i>0;i--)
{
rezolvare(i);
ok[ord[i]]=0;
if(c[ord[i]]>cmax)
cmax=c[ord[i]];
}
g<<cmax;
return 0;
}