题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5418
解题思路:
有n座城市,m条边,询问从1节点开始走遍所有节点回来的最短路径。
因为n比较小,因此可以用状压DP做
例如,我们用一个数i表示一种状态,若i转化为二进制为10111,表示去过1,2,3,5,没去过其他城市
先用Floyd求出任意两点最短路,记做mp[][],mp[i][j]表示i节点到j节点最短路径
DP的思路:
定义:dp[i][j]表示当前去过城市状态为i,最终停留在j时的最短路径 (注意不保证起点,这个问题之后分析)
初始化:根据dp[][]的定义,我们会这样初始化:
for (int i=1;i<=n;i++)
dp[1<<(i-1)][i] = 0;
因为走到自己的花费总是为0
其他都初始化为INF
状态转移:枚举当前状态下以j为终点的状态,取更新j和其他所有节点对应的状态
for i (枚举状态)
for j(枚举起点)
for k(枚举终点)
dp[i|(1<<(k-1))][k] = min(dp[i|(1<<(k-1))][k],dp[i][j]+mp[j][k]);