#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
inline int read() {
int x=0,y=1;
char e=getchar();
while(e<'0'||e>'9') {
if(e=='-') y=-1;
e=getchar();
}
while(e>='0'&&e<='9') {
x=(x<<3)+(x<<1)+(e-'0');
e=getchar();
}
return x*y;
}
int n,D;
double x[22],y[22];
double dp[22][1<<22];//飞到i状态为j
double f(double a,double b,double c,double d) { //(a,b),(c,d)
return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}
double dis[22][22];
signed main() {
memset(dp,0x7f,sizeof dp);
memset(dis,0x7f,sizeof dis);
dp[1][1]=0;
n=read(),D=read();
for(int i=1; i<=n; ++i) {
scanf("%lf%lf",&x[i],&y[i]);
}
for(int i=1; i<=n; ++i){
for(int j=1;j<=n;++j){
double dist=f(x[i],y[i],x[j],y[j]);
if(dist<=D)dis[i][j]=dist;
}
}
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
for(int k=1; k<(1<<n); ++k) {
for(int i=1; i<=n; ++i) {
if(k>>(i-1)&1) {
for(int j=1; j<=n; ++j) {
if(i!=j&&(k>>(j-1)&1)) {
if(dis[i][j]<=D)dp[i][k]=min(dp[i][k],dp[j][k^(1<<(i-1))]+dis[i][j]);
}
}
}
}
}
double ans=dp[0][0];
for(int i=1; i<=n; ++i) {
ans=min(ans,dp[i][(1<<n)-1]+dis[i][1]);
}
printf("%.2lf",ans);
return 0;
}
写的状压DP但全MLE