Pagini recente » Cod sursa (job #870840) | Cod sursa (job #2989568) | Monitorul de evaluare | Cod sursa (job #1005566) | Cod sursa (job #2005768)
#include <iostream>
#include <fstream>
#define INF 1999999999
using namespace std;
ifstream si("bibel.in");
ofstream so("bibel.out");
int niv=1;
int x[20],y[20],x0[20],y0[20];
int n=0;
int dist(int x1,int y1,int x2,int y2)
{
return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
}
int pr;
int d[1<<17][20];
int sol()
{
if(niv==1)
pr=n;
for(int i=1;i<(1<<n);++i)
for(int j=0;j<n;++j)
d[i][j]=INF;
for(int j=0;j<pr;j++)
for(int i=0;i<n;i++)
d[1<<i][i]=min(d[1<<i][i],d[0][j]+dist(x[i],y[i],x0[j],y0[j]));
for(int i=1;i<(1<<n);i++)
for(int j=0;j<n;j++)
if(i&(1<<j))
for(int 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]));
int ans=INF;
for(int i=0;i<n;i++)
{
ans=min(ans,d[(1<<n)-1][i]);
x0[i]=x[i];
y0[i]=y[i];
d[0][i]=d[(1<<n)-1][i];
}
pr=n;
return ans;
}
int main()
{
int a;
bool done=false;
while(!done)
{
si>>a;
switch(a)
{
case 0:
{
si>>x[n]>>y[n];
++n;
break;
}
case 1:
{
so<<sol()<<'\n';
n=0;
++niv;
break;
}
case 2: done=true; break;
}
}
return 0;
}