Pagini recente » Cod sursa (job #1024677) | Cod sursa (job #69793) | Cod sursa (job #1671783) | Cod sursa (job #196026) | Cod sursa (job #1200576)
#include <fstream>
using namespace std;
typedef struct nod
{
int value;
nod *urm;
} *pnod;
pnod v[16001];
int viz[16001],optim[3][16001],node[16001],maxim,n;
void addVertex(pnod &dest,int value)
{
pnod p=new nod;
p->value=value;
p->urm=dest;
dest=p;
}
void DFS(int nod,int tatal)
{
viz[nod]=1;
for(pnod p=v[nod];p;p=p->urm)
{
if(viz[p->value]==0)
{
if(optim[0][nod]<optim[2][nod]) optim[0][nod]=optim[2][nod];
optim[1][nod]=optim[0][nod];
if(optim[1][nod]+optim[1][p->value]>optim[1][p->value])
{
optim[1][p->value]=optim[1][nod]+optim[1][p->value];
optim[0][p->value]=optim[1][p->value];
}
DFS(p->value,nod);
}
else
{
if(optim[2][nod]+optim[2][tatal]>optim[2][tatal])
{
optim[2][tatal]=optim[2][nod]+optim[2][tatal];
}
}
}
}
int main()
{
FILE * fin,*fout;
int a,b,i;
fin=fopen("asmax.in","r");
fout=fopen("asmax.out","w");
fscanf(fin,"%d",&n);
maxim=-1001;
for(i=1;i<=n;i++)
{
fscanf(fin,"%d",&a);
node[i]=optim[0][i]=optim[1][i]=optim[2][i]=a;
}
for(i=1;i<n;i++)
{
fscanf(fin,"%d %d",&a,&b);
addVertex(v[a],b);
addVertex(v[b],a);
}
DFS(1,-1);
for(i=1;i<=n;i++)
if(optim[1][i]>optim[2][i] && optim[1][i]>maxim) maxim=optim[1][i];
else if(optim[1][i]<=optim[2][i] && optim[2][i]>maxim) maxim=optim[2][i];
fprintf(fout,"%d",maxim);
fclose(fin);
fclose(fout);
return 0;
}