从一个起始点(默认第一个点)出发,找到一条花费最短的路径经过所有其他点,然后又回到出发点,除了起始点经过两次,其他所有点必须经过一次且只能经过一次。
这里用到了set, set是一个不包含重复元素的集合,表示还未访问到的点,函数fun( i, set ) 表示从点 i 经过set 中的所有元素的最短路径。
这个问题可以这样分解,枚举 set 中的每个元素,选出点 i 到这个元素的距离 再加上 这个点到 set减去这个点的新集合的最短距离,递推公式为
fun( i, set )= min{ dist[ i ] [ j ] + fun( j, set-{ j} )}, 其中 j 是 set 中的所有元素。fun( j, set-{ j} )又可以依次推下去,直到 set为空,说明没有为访问的点了,这是递归调用的出口。