Pagini recente » Cod sursa (job #1645755) | Cod sursa (job #1601842) | Cod sursa (job #2487957) | Cod sursa (job #1794865) | Cod sursa (job #1071356)
#include<stdio.h>
#include<algorithm>
#include<cstring>
#define maxn 20
#define maxm 1<<18
#define inf 0x3f3f3f3f
using namespace std;
struct point{int x,y;} a[maxn],L[maxn];
int n,sol,Ln;
int d[maxn][maxn],Lv[maxn];
int s[maxm][maxn];
int dist(point a,point b){
return ((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void solve()
{
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
d[i][j]=d[j][i]=dist(a[i],a[j]);
for(int i=0;i<(1<<n);i++)
for(int j=0;j<n;j++)
s[i][j]=inf;
for(int i=0;i<n;i++)
for(int j=0;j<Ln;j++)
s[1<<i][i]=min(s[1<<i][i],Lv[j]+dist(L[j],a[i]));
for(int i=0;i<(1<<n);i++)
for(int j=0;j<n;j++)
if( (i>>j)&1 )
for(int k=0;(i>>k);k++)
if( ((i>>k)&1) )
s[i][j]=min(s[i][j],s[i^(1<<j)][k]+d[k][j]);
sol=inf;
for(int i=0;i<n;i++) sol=min(sol,s[(1<<n)-1][i]),Lv[i]=s[(1<<n)-1][i];
memcpy(L,a,sizeof(a));
printf("%d\n",sol); Ln=n;
}
void read()
{
int type; Ln=1; L[0].x=L[0].y=0;
for(scanf("%d",&type);type!=2;scanf("%d",&type))
{
if(!type)
{
scanf("%d%d",&a[n].x,&a[n].y);n++;
continue;
}
solve(); n=0;
}
}
int main()
{
freopen("bibel.in","r",stdin);
freopen("bibel.out","w",stdout);
read();
fclose(stdin);
fclose(stdout);
return 0;
}