Hamilton
定义
给定一张n个点的带权无向图,点从0~n-1标号,从0到n-1不重不漏地经过每个点恰好一次。
最短路径思路
用数字的二进制状态表示当前路径状态,0为没走过,1为走过,就可以遍历所有状态。
定义 dp[i][j]: i的二进制表示当前路径状态,j表示从1到j的最短路径。
则有 dp[i][j]前一状态为:dp[i^(1<<j)][k] "i^(1<<j)"表示第j位由1变为0
k必须存在,即(i>>k)&1==true。
状态转移方程为:dp[i][j]=min{dp[i^(1<<j)][k]+Weight[k][j]};
memset(dp, 0x7ffffffff, sizeof(dp));
dp[1][0] = 0;
for (int i = 1; i < (1 << n); i++)
{
for (int j = 0; j < n; j++)
{
if ((i >> j) & 1)
{
for (int k = 0; k < n; k++)
{
if ((i - (1 << j) >> k) & 1)
{
dp[i][j] = min(dp[i][j], dp[i - (1 << j)][k] + w[k][j]);
}
}
}
}
}