Pagini recente » Cod sursa (job #2358920) | Cod sursa (job #2607805) | Cod sursa (job #1399434) | Cod sursa (job #183665) | Cod sursa (job #479277)
Cod sursa(job #479277)
#include <cstdio>
#include <vector>
#include <deque>
using namespace std;
vector <int> nod[16006];
deque <int> t;
int vecini[16006],ok[16006],v[16006];
int main ()
{
int n,i,x,y,sol=-1000,nr=0;
freopen("asmax.in","r",stdin);
freopen("asmax.out","w",stdout);
scanf("%d",&n);
for (i=1;i<=n;++i)
scanf("%d",&v[i]);
for (i=1;i<n;++i)
{
scanf("%d %d",&x,&y);
nod[x].push_back(y);nod[y].push_back(x);
++vecini[x],++vecini[y];
}
for (i=1;i<=n;++i)
if (vecini[i]==1)
{
if (v[i]>0)
v[nod[i].front()]+=v[i];
ok[i]=1,t.push_back(nod[i].front()),++nr;
}
while (!t.empty())
for (i=nr,nr=0;i>0;--i)
{
x=t.front();t.pop_front();
if (v[x]>0)
while (!nod[x].empty())
{
if (!ok[nod[x].back()])
{v[nod[x].back()]+=v[x];++nr;t.push_back(nod[x].back());}
nod[x].pop_back();
} else
while (!nod[x].empty())
{
if (!ok[nod[x].back()]) ++nr,t.push_back(nod[x].back());
nod[x].pop_back();}
ok[x]=1;
}
for (i=1;i<=n;++i)
if (v[i]>sol) sol=v[i];
printf("%d",sol);
return 0;}