#845. 旅行商问题

旅行商问题

当前没有测试数据。

著名的旅行商问题(Traveling Salesman Problem,TSP)指一个 旅行商从一个城市出发,经过每个城市一次且只有一次回到原来的地 方,要求经过的距离最短。TSP问题是一个NP难题,目前没有多项式时 间的高效算法。若采用搜索+剪枝,则该算法的时间复杂度为O(n!)O (n !), 数据量大时,这种方法无法解决,可以尝试采用动态规划解决。

假设已访问的节点集合为SS (将源点00当作未被访问的节点,因为 从00出发,所以要回到00),当前所在的节点为uu

状态表示:dp[S][u] dp[S ][u ]表示已经访问的节点集合为SS ,从uu 出发 走完所有剩余节点回到源点的最短距离。

状态转移方程: 若当前uu 的邻接点vv 未访问,则dp[S][u]dp[S ][u ]由两 部分组成,第11部分是uu vv 的边值,第22部分是从vv 出发走完所有剩余 节点再回到源点的最短距离。访问完v 之后,已访问的节点集合变为SS {v}∪\{v \},若uu 有多个未被访问的邻接点vv ,则取最小值。dp[S][u]dp[S ][u]=min{dp[Smin\{dp[S ∪{vv }][v]+][v ]+d[u][v]vSd[u ][v ]|v ∉S },如下图所示。

image

临界条件: dp[(1<<n)1][0]=0dp[(1<<n )-1][0]=0,表示若所有节点都已被访问, 则此时已经没有剩余节点,从00节点出发走完所有剩余节点回到源点的 最短距离为00

旅行商问题可以采用递推和记忆化递归两种方法求解。

来源

Traveling Salesman Problem,TSP