Cod sursa(job #13687)

Utilizator megabyteBarsan Paul megabyte Data 7 februarie 2007 13:15:17
Problema Asmax Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <stdio.h>
#define NMAX 16384
#define INF "asmax.in"
#define OUF "asmax.out"
int s[NMAX];
char bit[NMAX]={0};
struct nod
{
	int x;
	nod *next;
};
struct lst
{
	nod *p,*q;
}list[NMAX];
void deeps(int vf)
{
    if(list[vf].p!=NULL)
    {
	    nod *op;
	    op=list[vf].p;
	    while(op!=NULL)
	    {
		    deeps(op->x);
		    if(s[op->x]>0){ s[vf]+=s[op->x];bit[vf]=1; }
		    op=op->next;
	    }
    }
}

int main()
{
	int n,i,a,b,v,max,cp=0;
	//char bit[NMAX]={0};
	nod *op;
	FILE *in,*out;
	in=fopen(INF,"r");
	out=fopen(OUF,"w");
	fscanf(in,"%d",&n);
	for(i=1;i<=n;i++)
	{
		fscanf(in,"%d",s+i);
		if(s[i]>0) cp++;
		list[i].p=list[i].q=NULL;
	}
        //for(i=1;i<=n;i++) printf("%d ",s[i]);
	//printf("\n");
	fscanf(in,"%d %d",&a,&b);
	op=new nod;
	op->x=b;op->next=NULL; 
	if(list[a].p==NULL) list[a].p=list[a].q=op;
	   else
	   {
		   list[a].q->next=op;
		   list[a].q=op;
	   }
	   v=a;
	for(i=2;i<n;i++)
	{
           fscanf(in,"%d %d",&a,&b);
	   op=new nod;
	   op->x=b;op->next=NULL; 
	   if(list[a].p==NULL) list[a].p=list[a].q=op;
	   else
	   {
		   list[a].q->next=op;
		   list[a].q=op;
	   }
	}
	if(cp>1){
	          deeps(v);
	          max=-16777216;
                  //	for(i=1;i<=n;i++) printf("%d ",s[i]);
	          for(i=1;i<=n;i++) if(s[i]>max) max=s[i];
	        }
	if(cp<2)
	{
           int max2=-16777216;s[0]=-16777216;
	   max=0;
	   for(i=1;i<=n;i++) if(s[i]>s[max]) max=i;
	   op=list[max].p;
	   while(op!=NULL)
	   {
		   if(s[op->x]>max2)max2=s[op->x];
		   op=op->next;
	   }
	   max=s[max]+max2;
        }
	fprintf(out,"%d",max);
	fclose(in);fclose(out);
	return 0;
}