Pagini recente » Cod sursa (job #2270011) | Cod sursa (job #950512) | Cod sursa (job #1183404) | Cod sursa (job #2570363) | Cod sursa (job #2553265)
#include <fstream>
#define pinf 1000000007
using namespace std;
ifstream fin ("bibel.in");
ofstream fout ("bibel.out");
int z, n, d[132000][20], b[210][3], niv, aux, p, ant, dist[210][210], mini, nr, inc, rez[20], nbant, incant, p2;
void rez_niv()
{
int i, j, r;
if (niv==1)
{
n=nr+1;
}
else
{
n=nr-inc+1;
}
for (i=0; i<nr; i++)
{
for (j=i+1; j<=nr; j++)
{
dist[i][j]=dist[j][i]=(b[j][1]-b[i][1])*(b[j][1]-b[i][1])+(b[j][2]-b[i][2])*(b[j][2]-b[i][2]);
}
}
aux=((1<<n)-1);
for (i=1; i<=aux; i++)
{
for (j=0; j<n; j++)
d[i][j]=pinf;
}
for (i=1; i<=aux; i++)
{
for (j=0; j<n; j++)
{
p=1<<j;
if ((p&i)>0)
{
ant=i-p;
if (ant==0)
{
for (r=0; r<nbant; r++)
{
if (rez[r]+dist[r+incant][j+inc]<d[i][j])
{
d[i][j]=rez[r]+dist[r+incant][j+inc];
}
}
}
else
for (r=0; r<n; r++)
{
if (d[ant][r]+dist[r+inc][j+inc]<d[i][j])
{
d[i][j]=d[ant][r]+dist[r+inc][j+inc];
}
}
}
}
}
mini=pinf;
for (i=0; i<n; i++)
{
if (d[aux][i]<mini)
mini=d[aux][i];
rez[i]=d[aux][i];
}
fout<<mini<<'\n';
nbant=n;
incant=inc;
}
int main()
{
n=0;
niv=0;
inc=0;
nbant=1;
while (fin>>z)
{
if (z==0)
{
nr++;
fin>>b[nr][1]>>b[nr][2];
}
else
{
if (z==1)
{
niv++;
rez_niv();
inc=nr+1;
}
}
}
fin.close();
fout.close();
return 0;
}