Cod sursa(job #121624)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 9 ianuarie 2008 09:39:46
Problema Bibel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include<stdio.h>
long int nv,dv[20],xv[20],yv[20],cod,nn,xn[20],yn[20],i,di[20],j,dia,
de[20][20],sol[17][131072],p2[20],vizmax,viz0,n0,n1,v0[20],v1[20],j1,k1,viz1,
j0,soll;
int main()
{
	FILE *f,*g;f=fopen("bibel.in","r");g=fopen("bibel.out","w");
	p2[0]=1;for(i=1;i<20;i++)p2[i]=2*p2[i-1];
	nv=1;dv[0]=0;xv[0]=0;yv[0]=0;
	do
	{ fscanf(f,"%ld",&cod);
	  if(cod==0){fscanf(f,"%ld%ld",&xn[nn],&yn[nn]);nn++;}
	  else
	  if(cod==1)
	  { for(i=0;i<nn;i++)
	     { di[i]=dv[0]+(xv[0]-xn[i])*(xv[0]-xn[i])+(yv[0]-yn[i])*(yv[0]-yn[i]);
	       for(j=1;j<nv;j++)
	       { dia=dv[j]+(xv[j]-xn[i])*(xv[j]-xn[i])+(yv[j]-yn[i])*(yv[j]-yn[i]);
		 if(di[i]>dia)di[i]=dia;
	       }
	     }
	     if(nn==1)
	      {dv[0]=di[0];xv[0]=xn[0];yv[0]=yn[0];nv=1;nn=0;soll=dv[0];
	       fprintf(g,"%ld\n",soll);
	      }
	     else
	     {for(i=0;i<nn-1;i++)
	       { for(j=i+1;j<nn;j++)
		 { de[i][j]=(xn[j]-xn[i])*(xn[j]-xn[i])+(yn[j]-yn[i])*(yn[j]-yn[i]);
		   de[j][i]=de[i][j];
		 }
	       }
	      for(i=0;i<nn;i++)
	       sol[i][p2[i]]=di[i];
	      vizmax=p2[nn]-1;
	      for(viz0=1;viz0<vizmax;viz0++)
	      { n0=0;n1=0;
		for(j=0;j<nn;j++)
		{ if(p2[j]&viz0){n0++;v0[n0]=j;}
		  else {n1++;v1[n1]=j;}
		}
		for(j1=1;j1<=n1;j1++)
		{ k1=v1[j1];viz1=viz0+p2[k1];
		  sol[k1][viz1]=sol[v0[1]][viz0]+de[k1][v0[1]];
		  for(j0=2;j0<=n0;j0++)
		  { soll=sol[v0[j0]][viz0]+de[k1][v0[j0]];
		    if(soll<sol[k1][viz1])sol[k1][viz1]=soll;
		  }
		}
	      }
	      soll=sol[0][vizmax];dv[0]=sol[0][vizmax];xv[0]=xn[0];yv[0]=yn[0];
	      for(i=1;i<nn;i++)
	      { dv[i]=sol[i][vizmax];xv[i]=xn[i];yv[i]=yn[i];
		if(dv[i]<soll)soll=dv[i];
	      }
	      nv=nn;nn=0;
	      fprintf(g,"%ld\n",soll);
	     }
	  }
	}while(cod!=2);
	fprintf(g,"\n");
	fcloseall();
	return 0;
}