Pagini recente » Cod sursa (job #2465849) | Cod sursa (job #866818) | Cod sursa (job #1308024) | Cod sursa (job #1371906) | Cod sursa (job #120618)
Cod sursa(job #120618)
#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;
}