//定义状态f[i][j]为1->i和1->j的两条路径,其中i>j,由对称性可减少一半的计算
//其他见下图:
#include <iostream> #include <queue> #include <stack> #include <string> #include <map> #include <vector> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; const int MAX=55,INF=1<<30; struct Point{ double x,y; }; int n; Point p[MAX]; double dis[MAX][MAX]; double f[MAX][MAX]; inline double Distance(const double &X,const double &Y){ return sqrt(X*X+Y*Y); } double bitonicTSP(){ for(int i=2;i<=n;i++) f[i][1]=dis[i][1];//intit for(int i=2;i<n;i++){ // for(int j=1;j<=i;j++) // f[i+1][j]=INF; f[i+1][i]=INF;//init for(int j=1;j<i;j++){ // f[i+1][j]=min(f[i+1][j],f[i][j]+dis[i][i+1]); f[i+1][j]=f[i][j]+dis[i][i+1]; f[i+1][i]=min(f[i+1][i],f[i][j]+dis[j][i+1]);//类似floyd更新方式 } } return f[n][n-1]+dis[n-1][n]; } int main() { #ifndef ONLINE_JUDGE freopen("i.txt", "r", stdin); #endif while(scanf("%d",&n)==1){ for(int i=1;i<=n;i++) scanf("%lf %lf",&p[i].x,&p[i].y); for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ dis[i][j]=Distance(p[i].x-p[j].x,p[i].y-p[j].y); dis[j][i]=dis[i][j]; } } printf("%.2lf\n",bitonicTSP()); } return 0; }