Pagini recente » Cod sursa (job #2098492) | Cod sursa (job #2591759) | Cod sursa (job #1246260) | Cod sursa (job #324681) | Cod sursa (job #2159581)
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("asmax.in");
ofstream fout("asmax.out");
vector <int > v[16001];
stack<int >f;
int n, m, a, b,maxi, cost[16001];
void caut_frunze()
{
for(int i=1;i<=n;i++)
if(v[i].size()==1)
f.push(i);
}
void afis_arb()
{
for(int i=1;i<=n;i++)
{
cout<<i<<": ";
for(int j=0;j<v[i].size();j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
fin>>cost[i];
for(int i=1;i<=n-1;i++)
{
fin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
//
// afis_arb();
// v[1].erase(find(v[1].begin(),v[1].end(),3));
//
// afis_arb();
caut_frunze();
while(!f.empty())
{
int nod=f.top();
f.pop();
while(v[nod].size()==1 && cost[nod]<0)
{
int aux=v[nod][0];
v[aux].erase(find(v[aux].begin(),v[aux].end(),nod));
v[nod].pop_back();
nod=aux;
}
while(v[nod].size()==1)
{
int aux=v[nod][0];
if(cost[aux]+cost[nod]>cost[aux])
{cost[aux]=cost[aux]+cost[nod];
maxi=cost[aux];
}
v[aux].erase(find(v[aux].begin(),v[aux].end(),nod));
v[nod].pop_back();
nod=aux;
}
}
fout<<maxi;
// afis_arb();
// for(int i=1;i<=n;i++)
// cout<<cost[i]<<" ";
return 0;
}
//7
//-1 1 3 1 -1 1 -1
//4 1
//1 3
//1 2
//6 5
//6 4
//7 5