#include<bits/stdc++.h>
using namespace std;
double x[16],y[16];
double dp[16][33000];
double d[16][16];
double dis(int u,int v)
{
return sqrt((x[u]-x[v])*(x[u]-x[v])+(y[u]-y[v])*(y[u]-y[v]));
}
int main()
{
memset(dp,127,sizeof(dp));
int n;
cin>>n;
x[0]=0;
y[0]=0;
for(int i=1;i<=n;i++)
{
cin>>x[i]>>y[i];
}
for(int i=0;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
d[i][j]=dis(i,j);
d[j][i]=dis(j,i);
}
}
for(int i=1;i<=n;i++)
{
dp[i][1<<(i-1)]=d[0][i];
}
for(int k=1;k<(1<<n);k++)
{
for(int i=1;i<=n;i++)
{
if(k&(1<<(i-1))==0) continue;
for(int j=1;j<=n;j++)
{
if(i==j) continue;
if(k&(1<<(j-1))==0) continue;
dp[i][k]=min(dp[i][k],dp[j][k-(1<<(i-1))]+d[i][j]);
}
}
}
double ans=dp[0][0];
for(int i=1;i<=n;i++)
{
ans=min(ans,dp[i][(1<<n)-1]);
}
printf("%.2lf",ans);
return 0;
}
第五个点得数据: 11 -1 -1 100 100 -1 0 1 1 -1 1 2 2 0 -1 3 3 0 1 1 -1 1 0