Cod sursa(job #120345)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 4 ianuarie 2008 23:20:54
Problema Bibel Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<stdio.h>
long long int cod,i,sol,
xv[20],yv[20],dv[20],nv,
xn[20],yn[20],dn[20],nn,
xc[20],yc[20],dc[20],
dnn[20][20],dvn[20][20],
viz[20],b[20],ddn[20][20],j,k,dist;
void solve(long long int poz);
int main()
{
	FILE *f,*g;f=fopen("bibel.in","r");g=fopen("bibel.out","w");
	nv=1;xv[1]=0;yv[1]=0;
	for(i=1;i<20;i++)dnn[i][i]=1000000000;
	do
	{
	    fscanf(f,"%lld",&cod);
	    if(cod==0){nn++;fscanf(f,"%lld%lld",&xn[nn],&yn[nn]);dn[nn]=1000000000;}
	    else
	    if(cod==1)
	    {  for(i=1;i<=nv;i++)
		for(j=1;j<=nn;j++)
		 dvn[i][j]=(xv[i]-xn[j])*(xv[i]-xn[j])+(yv[i]-yn[j])*(yv[i]-yn[j]);
	       for(i=1;i<nn;i++)
		for(j=i+1;j<=nn;j++)
		 { ddn[i][j]=(xn[i]-xn[j])*(xn[i]-xn[j])+(yn[i]-yn[j])*(yn[i]-yn[j]);
		   ddn[j][i]=ddn[i][j];
		 }
	       for(i=1;i<nn;i++)
		for(j=i+1;j<=nn;j++)
		{ b[1]=i;b[nn]=j;dnn[i][j]=1000000000;
		  viz[i]=1;viz[j]=1;
		  solve(2);
		  dnn[j][i]=dnn[i][j];
		  viz[i]=0;viz[j]=0;
		}

	       for(i=1;i<=nn;i++)
		{ dn[i]=1000000000;
		  for(j=1;j<=nn;j++)
		   for(k=1;k<=nv;k++)
		    { dist=dv[k]+dvn[k][j]+dnn[j][i];
		      if(dist<dn[i])dn[i]=dist;
		    }
		}
	       sol=dn[1];for(i=1;i<=nn;i++)if(sol>dn[i])sol=dn[i];
	       for(i=1;i<=nn;i++)
	       { xv[i]=xn[i];xn[i]=0;
		 yv[i]=yn[i];yn[i]=0;
		 dv[i]=dn[i];dn[i]=0;
	       }
	       nv=nn;nn=0;
	       fprintf(g,"%lld\n",sol);
	    }
	}while(cod!=2);
	fcloseall();
	return 0;
}
void solve(long long int poz)
{       long long int il;
	if(poz==nn)
	{ dc[nn]=dc[poz-1]+ddn[b[nn-1]][j];
	  if(dc[nn]<dnn[i][j])
	   dnn[i][j]=dc[poz];
	   dc[poz]=0;
	   return;
	}
	for(il=1;il<=nn;il++)
	{ if(!viz[il])
	  { viz[il]=1;
	    b[poz]=il;
	    dc[poz]=dc[poz-1]+ddn[il][b[poz-1]];
	    if(dc[poz]<dnn[i][j])solve(poz+1);
	    dc[poz]=0;
	    b[poz]=0;
	    viz[il]=0;
	  }
	}
}