#include<bits/stdc++.h>
#define ld double
using namespace std;
const int N=19;
ld ans,dp[1<<N][N],w[N][N];
int x[N],y[N],n,m;
ld odj(int x,int y,int o,int p)
{
return sqrt((x-o)*(x-o)+(y-p)*(y-p));
}
int Q(int x)
{
int cnt=0;
x=x>>n+1;
for(;x;x-=(x&-x))
cnt++;
return cnt;
}
int main()
{
for(int i=0;i<(1<<N);i++)
for(int j=0;j<N;j++)
dp[i][j]=1e9;
cin>>n>>m;
int i=1,g=n+m+1;
for(i=1;i<=n;i++)
cin>>x[i]>>y[i];
for(;i<g;i++)
cin>>x[i]>>y[i];
for(i=0;i<=g;i++)
for(int j=0;j<=g;j++)
w[i][j]=odj(x[i],y[i],x[j],y[j]);
dp[1][0]=0;
for(int i=0;i<(1<<g);i++)
for(int j=0;j<g;j++)
if((i>>j)&1)
for(int k=0;k<g;k++)
if(((i>>k)&1))
dp[i][j]=min(dp[i][j],dp[i^(1<<j)][k]+w[k][j]/(1<<Q(i^(1<<j))));
int o=(1<<n+1)-1;
ld ans=1e9;
for(int i=0;i<(1<<m);i++)
{
for(int j=0;j<g;j++)
{
int x=o+(i<<(n+1));
// cout<<bitset<sizeof(x)*8>(x);
// printf(" %.7Lf %d\n",dp[o+(i<<(n+1))][j]+w[0][j]/(1<<Q(x)),Q(x));
ans=min(ans,dp[x][j]+w[0][j]/(1<<Q(x)));
}
}
printf("%.10lf",ans);
return 0;
}
WA on #5