Cod sursa(job #43438)

Utilizator wazupPricop Mircea wazup Data 30 martie 2007 08:28:53
Problema Regiuni Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <fstream.h>
int a[205],ad[205][205],n,i,rez[5],x,y,viz[205],prec[205],prev[205],grades[205],parents[205],sp;
long long sumep[205],min,max,dmin=1000001;
ifstream fin("petrica.in");

ofstream fout("petrica.out");

int isparent(int i,int j)
  { if (ad[i][j]==2)
      return 1;
    return 0;
  }

void compare()
  {
    int i,j;
    min=1000001;
    max=-1;
    //1
     sumep[1]-=sumep[rez[1]];
    //2
     if (isparent(rez[1],rez[2]))
	sumep[rez[1]]-=sumep[rez[2]];
     else
	sumep[1]-=sumep[rez[2]];
    //3
     if (isparent(rez[2],rez[3]))
	sumep[rez[2]]-=sumep[rez[3]];
     else
       if (isparent(rez[1],rez[3]))
	sumep[rez[1]]-=sumep[rez[3]];
       else
	sumep[1]-=sumep[rez[3]];

   if (sumep[1]<min)
      min=sumep[1];
   if (sumep[1]>max)
      max=sumep[1];

   if (sumep[rez[1]]<min)
      min=sumep[rez[1]];
   if (sumep[rez[1]]>max)
      max=sumep[rez[1]];

   if (sumep[rez[2]]<min)
      min=sumep[rez[2]];
   if (sumep[rez[2]]>max)
      max=sumep[rez[2]];

   if (sumep[rez[3]]<min)
      min=sumep[rez[3]];
   if (sumep[rez[3]]>max)
      max=sumep[rez[3]];

   if (max-min<dmin)
     dmin=max-min;
   for (i=1;i<=n;i++)
     sumep[i]=prev[i];
  }


void back(int k)
  {
    int i;
    int x,y;
    if (k==4)
       { compare();
	 return;
	 }
    for (i=2;i<=n;i++)
     if (grades[i]>grades[rez[k-1]])
      { rez[k]=i;
	back(k+1);
	}
     else
       if (grades[i]==grades[rez[k-1]]&&i>rez[k-1])
	 { rez[k]=i;
	   back(k+1);
	 }
  }




long long sume(char st,int sofar)
  { int i=0;
    viz[st]=1;
    grades[st]=sofar;
    for (i=0;i<sp;i++)
      ad[parents[i]][st]=2;
    parents[sp++]=st;
    for (i=1;i<=n;i++)
      if (ad[st][i]==1&&viz[i]==0)
	  { viz[i]=1;
	    prec[i]=st;
	    prev[st]=sumep[st]=sume(i,sofar+1)+sumep[st];
	    }
    sp--;
    return sumep[st];
  }


int main()
{
fin>>n;
for (i=0;i<n;i++)
  {fin>>a[i];
   prev[i+1]=sumep[i+1]=a[i];
   }
for (i=0;i<n-1;i++)
  {fin>>x>>y;
   ad[x][y]=1;
   ad[y][x]=1;
  }


sume(1,1);
back(1);
fout<<dmin<<'\n';
return 0;
}