Cod sursa(job #120618)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 5 ianuarie 2008 23:15:08
Problema Bibel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include<stdio.h>
unsigned long int p2[20],i,j,k,s[17][131071],cod,xv[20],yv[20],dv[20],nv,
nn,d[20][20],xn[20],yn[20],di,dia,k1,j1,dist,dn[20],sol;
int main()
{
	FILE *f,*g;f=fopen("bibel.in","r");g=fopen("bibel.out","w");
	p2[0]=1;for(i=1;i<=17;i++)p2[i]=p2[i-1]*2;
	j=p2[17];
	for(i=0;i<3;i++)for(k=0;k<j;k++)s[i][k]=2000000000;
	xv[0]=0;yv[0]=0;dv[0]=0;nv=1;
	do{ fscanf(f,"%lu",&cod);
	    if(cod==0){fscanf(f,"%lu%lu",&xn[nn],&yn[nn]);nn++;}
	     else
	    if(cod==1)
	    {if(nn==0) fprintf(g,"%lu\n",sol);
	     else
	     if(nn==1)
	     { dn[0]=dv[0]+(xn[0]-xv[0])*(xn[0]-xv[0])+(yn[0]-yv[0])*(yn[0]-yv[0]);
	       for(i=1;i<nv;i++)
	       { dist=dv[i]+(xn[0]-xv[i])*(xn[0]-xv[i])+(yn[0]-yv[i])*(yn[0]-yv[i]);
		 if(dist<dn[0])dn[0]=i;
		 sol=dn[0];
		 fprintf(g,"%lu\n",sol);
		 nv=1;xv[0]=xn[0];yv[0]=yn[0];dv[0]=dn[0];dn[0]=2000000000;
	       }
	     }
	     else
	      { for(i=0;i<nn;i++)dn[i]=2000000000;
		for(i=0;i<nn-1;i++)
		for(j=i+1;j<nn;j++)
		  d[i][j]=(xn[i]-xn[j])*(xn[i]-xn[j])+(yn[i]-yn[j])*(yn[i]-yn[j]);
		 for(i=0;i<nn-1;i++)
		  for(j=i+1;j<nn;j++)
		   d[j][i]=d[i][j];
		 for(i=0;i<nn;i++)
		  { di=dv[0]+(xn[i]-xv[0])*(xn[i]-xv[0])+(yn[i]-yv[0])*(yn[i]-yv[0]);
		    for(j=1;j<nv;j++)
		    { dia=dv[j]+(xn[i]-xv[j])*(xn[i]-xv[j])+(yn[i]-yv[j])*(yn[i]-yv[j]);
		     di=(di<dia)?di:dia;}
		    for(j=0;j<nn;j++)if(j!=i) s[j][p2[i]+p2[j]]=di+d[i][j];
		    for(k=p2[i]+1;k<p2[nn]-1;k++)
		    { if(k&p2[i])
		      { for(j=0;j<nn;j++)
			{ if((p2[j]&k)==0)
			  { k1=k+p2[j];
			    for(j1=0;j1<nn;j1++)
			     if((p2[j1]&k)&&(j1!=i))
			      { dist=s[j1][k]+d[j1][j];
				if(dist<s[j][k1])
				s[j][k1]=dist;
			      }
			  }
		       }
		       for(j=0;j<nn;j++)s[j][k]=2000000000;
		     }
		  }
		  k=p2[nn]-1;
		  for(j=0;j<nn;j++)
		   {if(dn[j]>s[j][k])dn[j]=s[j][k];s[j][k]=2000000000;}
	      }
	      sol=dn[0];
	      for(i=0;i<nn;i++) if(dn[i]<sol)sol=dn[i];
	      fprintf(g,"%lu\n",sol);
	      for(i=0;i<20;i++){ xv[i]=xn[i];yv[i]=yn[i];dv[i]=dn[i];dn[i]=1000000000;}
	      nv=nn;nn=0;
	    }
	  }
	}
	while(cod!=2);
	fcloseall();
	return 0;
}