站外题,用不了火车头
#include<iostream>
#define min(x,y) ((x>y)?y:x)
#define sqr(x) ((x)*(x))
int main()
{
std::ios::sync_with_stdio(0);
std::cin.tie(0);
register int n,x[25],y[25],dp[(1<<24)+1],i,j,k,tx,tot,dist[25][25];
std::cin>>x[0]>>y[0]>>n;
for (i=1;i<=n;i++)
std::cin>>x[i]>>y[i];
for (i=0;i<=n;i++)
for (j=0;j<=n;j++)
dist[i][j]=sqr(x[i]-x[j])+sqr(y[i]-y[j]);
tot=(1<<n);
dp[0]=0;
for (i=1;i<tot;i++)
{
for (j=1;j<=n;j++)
{
if ((i&(1<<(j-1))))
{
tx=i^(1<<(j-1));
dp[i]=(dp[tx]+(dist[j][0]<<1));
for (k=1;k<=n;k++)
if ((tx&(1<<(k-1))))
dp[i]=min(dp[i],dp[tx^(1<<(k-1))]+dist[j][0]+dist[j][k]+dist[k][0]);
break;
}
}
}
std::cout<<dp[tot-1];
}