解题思路
设 f i , j f_{i,j} fi,j表示j 状态走到i时的最短 H a m i l t o n Hamilton Hamilton路径
方程:
到
j
j
j之前,设到达了,就是到达
f
i
,
j
f_{i,j}
fi,j,这个状态前 先到达了
f
k
,
j
−
(
1
<
<
i
)
f_{k,j-(1<<i)}
fk,j−(1<<i),
那么
f
i
,
j
=
f
j
−
(
1
<
<
i
)
,
k
+
a
k
,
i
f_{i,j}=f_{j-(1<<i),k}+a_{k,i}
fi,j=fj−(1<<i),k+ak,i判一下j 和k 的存在性就好了.
因为从0 开始 最后
a
n
s
=
f
(
1
<
<
n
)
−
1
,
n
−
1
ans=f_{(1<<n)-1,n-1}
ans=f(1<<n)−1,n−1
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,ans;
int a[25][25],f[25][1<<21];
int main()
{
scanf("%d",&n);
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
scanf("%d",&a[i][j]);
memset(f,0x7f,sizeof(f));
f[0][1]=0;
for(int j=1; j<(1<<n); j++)
for(int i=0; i<n; i++)
{
if(!(j>>i)&1)continue;
for(int k=0;k<n;k++)
{
if(j-(1<<i)>>k&1)
f[i][j]=min(f[i][j],f[k][j-(1<<i)]+a[k][i]);
}
}
printf("%d",f[n-1][(1<<n)-1]);
}