Pagini recente » Cod sursa (job #634309) | Cod sursa (job #554886) | Cod sursa (job #1798450) | Cod sursa (job #2577900) | Cod sursa (job #2676606)
#include <iostream>
#include <fstream>
#define INF 1999999999999
using namespace std;
ifstream fin("bibel.in");
ofstream fout("bibel.out");
int niv=1;
long long int x[20], y[20], x0[20], y00[20];
int n,i,j,k;
int dist(long long int x1, long long int y1, long long int x2, long long int y2)
{
return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
}
int pr;
long long int d[1<<17][20];
int sol()
{
if(niv==1)
pr=n;
for(i=1;i<=(1<<n);++i)
for(j=0;j<n;++j)
d[i][j]=INF;
for(j=0;j<pr; j++)
for(i=0;i<n;i++)
d[1<<i][i]=min(d[1<<i][i],d[0][j]+dist(x[i],y[i],x0[j],y00[j]));
for(i=1;i<(1<<n);i++)
for(j=0;j<n;j++)
if(i&(1<<j))
for(k=0;k<n;k++)
if(i&(1<<k) && k!=j)
d[i][j]=min(d[i][j],d[i^(1<<j)][k]+dist(x[k],y[k],x[j],y[j]));
long long ans=INF;
for(i=0;i<n;i++)
{
ans=min(ans,d[(1<<n)-1][i]);
x0[i]=x[i];
y00[i]=y[i];
d[0][i]=d[(1<<n)-1][i];
}
pr=n;
return ans;
}
int main()
{
int a;
bool done=false;
while(!done)
{
fin>>a;
if(a==0)
{
fin>>x[n]>>y[n];
n++;
}
if(a==1)
{
fout<<sol()<<"\n";
n=0;
niv++;
}
if(a==2)
done=true;
}
fin.close();
fout.close();
return 0;
}