Cod sursa(job #120603)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 5 ianuarie 2008 22:50:50
Problema Bibel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<stdio.h>
long long int p2[20],i,j,k,s[17][131100],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,"%ld",&cod);
	    if(cod==0){fscanf(f,"%lld%lld",&xn[nn],&yn[nn]);nn++;}
	     else
	    if(cod==1)
	    { 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,"%lld\n",sol);
	      for(i=0;i<nn;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;
}