Cod sursa(job #1200576)

Utilizator IulianBoboUAIC Boboc Iulian IulianBobo Data 22 iunie 2014 21:56:50
Problema Asmax Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#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;
}