Pagini recente » Cod sursa (job #2770502) | Cod sursa (job #935395) | Cod sursa (job #2027481) | Cod sursa (job #2568877) | Cod sursa (job #1362560)
#include <fstream>
#include <vector>
#define NMAX 16009
using namespace std;
ifstream fin ("asmax.in");
ofstream fout ("asmax.out");
int n;
int nivmax;
int v[NMAX];
int M[NMAX];
int tata[NMAX];
vector <int> L[NMAX], niv[NMAX];
void citire ();
void nivel ();
void pd ();
int main()
{
citire();
nivel();
pd();
return 0;
}
void citire ()
{
int i;
int a, b;
fin>>n;
for(i=1; i<=n; ++i)
fin>>M[i];
for(i=1; i<n; ++i)
{
fin>>a>>b;
L[a].push_back(b);
L[b].push_back(a);
}
}
void nivel ()
{
int i, j, k, total=1, vf;
/*int crt=0; urm=1;
int primcrt=ultimcrt=0, ultimurm;
c[crt][++ultimcrt]=1;
niv[1].push_back(1);
for(nivmax=1; total<=n; ++nivmax)
{
ultimurm=primcrt=0;
while(primcrt<=ultimcrt)
{
vf=c[crt][++primcrt];
for(i=1; i<=L[vf].size(); ++i)
if(tata[vf]!=L[vf][i])
{
tata[L[vf][i]]=vf;
c[urm][++ultimurm]=L[vf][i];
niv[nivmax].push_back(L[vf][i]);
++total;
}
}
crt=1-crt;
urm=1-urm;
ultimcrt=ultimurm;
}*/
niv[1].push_back(1);
for(nivmax=1; total<n; ++nivmax)
{
for(j=0; j<niv[nivmax].size(); ++j)
{
vf=niv[nivmax][j];
for(k=0; k<L[vf].size(); ++k)
if(tata[vf]!=L[vf][k])
{
tata[L[vf][k]]=vf;
niv[nivmax+1].push_back(L[vf][k]);
++total;
}
}
}
}
void pd ()
{
int i, j;
//parcurg de la ultimul nivel
for(i=nivmax-1; i>=1; --i)
{
for(j=0; j<niv[i].size(); ++j)
M[tata[niv[i][j]]]=max( M[tata[niv[i][j]]], M[niv[i][j]]+M[tata[niv[i][j]]]);
}
fout<<M[1]<<'\n';
}