</pre><pre class="cpp" name="code">#include <stdio.h>
int INF = 10000000007;
int n, x[30], y[30], dp[1<<24], dis[30][30], pre[1<<24];
int main ()
{
int xx,yy;
scanf ("%d %d %d", &xx, &yy, &n);
for (int i = 0;i < n;i++) scanf ("%d %d", &x[i], &y[i]);
x[n] = xx; y[n] = yy;
for (int i = 0;i <= n;i++)
for (int j = 0; j <= n;j++)
{
dis[i][j] = (x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]);
}
for (int i = 1; i < (1<<24);i++) dp[i] = INF;
for (int i = 0;i < (1<<n);i++)
if (dp[i] != INF)
{
for (int j = 0;j < n;j++)
if(!(i&(1<<j)))
{
int t = i|(1<<j);
int l = dp[i] + dis[n][j] + dis[j][n];
if (dp[t] > l)
{
dp[t] = l;
pre[t] = i;
}
for (int k = j + 1;k < n;k++)
{
if (!(t&(1<<k)))
{
int p = t|(1<<k);
l = dp[i] + dis[n][j]+dis[j][k] + dis[k][n];
if (dp[p] > l)
{
dp[p] = l;
pre[p] = i;
}
}
}
break;
}
}
int m = (1<<n) - 1;
printf ("%d\n0", dp[m]);
for (;m;m = pre[m])
{
for (int i = 0; i < n;i++) if ((m^pre[m])&(1<<i)) printf(" %d", i+1);
printf (" 0");
}
}
CodeForces 8C-Looking for Order
最新推荐文章于 2019-05-05 12:59:34 发布