输入
11
-1 -1
100 100
-1 0
1 1
-1 1
2 2
0 -1
3 3
0 1
1 -1
1 0
输出答案
148.01
我的
149.01
#include<bits/stdc++.h>
using namespace std;
typedef pair<double,double> PDD;
const int N=20,M=1<<N;
PDD d[N];
#define x first
#define y second
double f[M][N],w[N][N],ans=35000;
double dis(int i,int j){
return (double)sqrt((double)(d[i].x-d[j].x)*(d[i].x-d[j].x)+(double)(d[i].y-d[j].y)*(d[i].y-d[j].y));
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%lf%lf",&d[i].x,&d[i].y);
ans=min(ans,dis(i,n));
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
w[i][j]=dis(i,j);
}
}
for(int i=0;i<1<<n;i++){
for(int j=0;j<n;j++){
f[i][j]=35000;
}
}
f[1][0]=ans;
for(int i=0;i<1<<n;i++){
for(int j=0;j<n;j++){
if(i>>j&1){
for(int k=0;k<n;k++){
if(i>>k&1){
f[i][j]=min(f[i][j],f[i-(1<<j)][k]+w[k][j]);
}
}
}
}
}
double res=35000;
for(int i=0;i<n;i++) res=min(res,f[(1<<n)-1][i]);
printf("%.2lf",res);
return 0;
}