```cpp
#include<bits/stdc++.h>
const double inf=0x7f7f7f7f7f7f7f7f;
const int N=201;
int n;
double dis[N][N];
double x[N],y[N];
double dp[1<<16][N];
double cal(int a,int b){
return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
}
int main(void){
std::ios::sync_with_stdio(false),std::cin.tie(nullptr);//std::cout.tie(nullptr);
std::cin>>n;
x[0]=y[0]=0;
for(int i=1;i<=n;++i)std::cin>>x[i]>>y[i];//枚举第一个点即可
memset(dis,0x7f,sizeof(dis));
for(int i=1;i<=n;++i)dis[i][i]=0;
for(int i=1;i<=n;++i){
for(int j=i+1;j<=n;++j)dis[i][j]=dis[j][i]=cal(i,j);
}
memset(dp,0x7f,sizeof(dp));
for(int i=1;i<=n;++i)dp[1<<(i-1)][i]=0;
for(int mask=0;mask<(1<<n);++mask){
for(int i=1;i<=n;++i){
if(~mask>>(i-1)&1||dp[mask][i]==inf)continue;
for(int j=1;j<=n;++j){
if(mask>>(j-1)&1||dis[i][j]==inf)continue;
dp[mask|1<<(j-1)][j]=std::min(dp[mask|1<<(j-1)][j],dp[mask][i]+dis[i][j]);
}
}
}
double ans=inf;
for(int i=1;i<=n;++i){
ans=std::min(ans,dp[(1<<n)-1][i]+cal(0,i));
}
printf("%.2lf",ans);
return 0;
}
```
by jayket @ 2024-01-29 22:06:45