1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<ctime> 5 #include<iostream> 6 #include<algorithm> 7 #include<queue> 8 #include<set> 9 #define inf (0x7fffffff) 10 #define l(a) ((a)<<1) 11 #define r(a) ((a)<<1|1) 12 #define b(a) (1<<(a)) 13 #define T_min (1e-8) 14 #define R (0.9998) 15 #define e (2.718281828459045) 16 #define pi (3.14159265358979323846) 17 #define rep(i,a,b) for(int i=a;i<=(b);i++) 18 #define clr(a) memset(a,0,sizeof(a)) 19 typedef long long ll; 20 typedef unsigned long long ull; 21 using namespace std; 22 int readint(){ 23 int t=0,f=1;char c=getchar(); 24 while(!isdigit(c)){ 25 if(c=='-') f=-1; 26 c=getchar(); 27 } 28 while(isdigit(c)){ 29 t=(t<<3)+(t<<1)+c-'0'; 30 c=getchar(); 31 } 32 return t*f; 33 } 34 const int maxn=1009; 35 int n; 36 double d[maxn][maxn]; 37 struct node{ 38 double x,y; 39 inline bool operator<(const node A)const{ 40 return x<A.x||(x==A.x&&y<A.y); 41 } 42 }X[maxn]; 43 double dis(int u,int v){ 44 return sqrt((X[u].x-X[v].x)*(X[u].x-X[v].x)+(X[u].y-X[v].y)*(X[u].y-X[v].y)); 45 } 46 int main(){ 47 //freopen("#input.txt","r",stdin); 48 //freopen("#output.txt","w",stdout); 49 n=readint(); 50 rep(i,1,n){ 51 X[i].x=readint();X[i].y=readint(); 52 } 53 sort(X+1,X+n+1); 54 //rep(i,1,n) printf("%d %d ",X[i].x,X[i].y); 55 rep(i,1,n) rep(j,1,n) d[i][j]=1e30;d[1][2]=dis(1,2); 56 rep(j,2,n){ 57 rep(i,1,j-1){ 58 if(j==i+1){ 59 rep(k,1,i-1) d[i][j]=min(d[i][j],d[k][i]+dis(j,k)); 60 }else d[i][j]=min(d[i][j],d[i][j-1]+dis(j,j-1)); 61 } 62 } 63 double ans=1e30; 64 rep(i,1,n-1) ans=min(ans,d[i][n]+dis(i,n)); 65 printf("%.2lf ",ans); 66 //fclose(stdin); 67 //fclose(stdout); 68 return 0; 69 }