题面
旅行商问题,即 TSP 问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访 n 个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
TSP 是一道经典的 NP-完全问题,在规模比较小的时候可以用动态规划求解。
有 n n n个城市,两两之间均有道路直接相连。给出每个城市 i i i 和 j j j 之间的道路长度 d i s t ( i , j ) dist(i,j) dist(i,j),求一条经过每个城市一次 且仅一次,最后回到起点的路线,使得经过的道路总长度最短。 n ≤ 16 n \le16 n≤16,城市编号为 0 ∼ n − 1 0\sim n-1 0∼n−1
解题思路
将状压dp的状态dp[i][j]设为i是一个二进制数,如果当前这位为1,则这个编号对应的城市去过,否则没有去过,j表示最后到达的城市编号,为了方便起见,编号从0开始。
在读入城市距离的过程中,将无法到达的城市距离设为无穷大,这样就能保证在后续的min中不可能能考虑到该情况。
初始化时将dp数组中的每一位都设为无穷大,将dp[1][0]设为0,方便设置从1出发的情况。
第一层 s s s循环分别枚举0~(1<<n),每个城市是否去过(0和1两种情况),第二层 i i