https://www.luogu.org/problemnew/show/P1433
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <deque>
#include <stack>
#define INF 0x3f3f3f3
using namespace std;
typedef long long LL;
int N,vis[20];
double ans;
struct DM
{
double x,y;
}num[20];
double dis(int i,int j)
{
return sqrt((num[i].x-num[j].x)*(num[i].x-num[j].x)+(num[i].y-num[j].y)*(num[i].y-num[j].y));
}
void dfs(int cnt,double sum,int pre)
{
if(sum>ans)return ;
if(cnt==N)
{
ans=min(ans,sum);
return ;
}
for(int i=1;i<=N;i++)
{
if(!vis[i])
{
vis[i]=1;
dfs(cnt+1,sum+dis(pre,i),i);
vis[i]=0;
}
}
}
int main()
{
scanf("%d",&N);
for(int i=1;i<=N;i++)scanf("%lf%lf",&num[i].x,&num[i].y);
num[0].x=num[0].y=0;
ans=(double)INF;
dfs(0,0,0);
printf("%.2lf\n",ans);
return 0;
}