#include<bits/stdc++.h>
using namespace std;
const int MAXN=300;
const int INF=1000000000;
int n;
double dis[MAXN][MAXN]={};
double x[20];
double y[20];
double ans=INF;
bool vis[MAXN]={false};
void dfs(int nowid,int num,double nowlength){
if(nowlength>ans) return;
if(num==n){
ans=min(ans,nowlength);return;
}
for(int i=1;i<=n;i++){
if(vis[i]==false){
vis[i]=true;
dfs(i,num+1,nowlength+dis[nowid][i]);
vis[i]=false;
}
}
}
int main()
{
freopen("in.txt","r",stdin);
cin>>n;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
}
x[0]=0,y[0]=0;
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++){
double temp=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
dis[i][j]=sqrt(temp);
}
}
dfs(0,0,0.0);
printf("%.2lf",ans);
return 0;
}
void dfs(答案,搜索层数,其他参数){
if(层数==maxdeep){
更新答案;
return;
}
(剪枝)
for(枚举下一层可能的状态){
更新全局变量表示状态的变量;
dfs(答案+新状态增加的价值,层数+1,其他参数);
还原全局变量表示状态的变量;
}
}