题目描述
小王是一名基站维护工程师,负责某区域的基站维护。某地方有 n 个基站(1 < n < 10),已知各基站之间的距离 s(0 < s < 500),并且基站 x 到基站 y 的距离与基站 y 到基站 x 的距离并不一定相同。
小王从基站 1 出发,途经每个基站 1 次,然后返回基站 1,请为他选择一条距离最短的路。
输入描述:第一行为基站数 n,接下来 n 行每行 n 个整数,表示 n*n 的距离矩阵,第 i 行第 j 列表示从基站 i 到基站 j 的距离(基站编号从 1 开始,对角线为 0)。
输出描述:最短回路的总距离。
讲个故事:小王跑基站
小王管着几个基站,今天得从 1 号基站出发,把每个基站都跑一遍,再回 1 号。每两个基站之间有距离,而且去程和回程还不一样长(单行道绕路嘛)。
他得算出一条最短的环形路线。基站不多,不到 10 个,但排列组合也不少,得用点聪明的法子。
说白了就是经典的旅行商问题,节点少,状态压缩动态规划正好合适。
核心原理:状压 DP 解 TSP
n 个节点,从节点 0(基站 1)出发,访问所有节点各一次,再回到 0,求最短回路。
用 dp[mask][i] 表示已经访问了集合 mask 中的节点、当前在节点 i 时的最短距离。mask 用 n 位二进制表示。
转移:从 i 走到没访问过的 j,dp[mask | (1<<j)][j] = min(..