链接
\(\text{HDU - 3001 Travelling}\)
题意
某一天你有个旅游的计划,这里有\(n\)个城市,你想要访问完\(n\)个城市,开始的时候你可以从任何城市出发,你已经知道了一个二维矩阵\(a[i][j]\),表示城市\(i\)与城市\(j\)之间互相抵达需要的花费,现在需要计算出访问完\(n\)个城市所需要的最小花费,每个城市最多被允许访问两次。
数据范围:\(1\leq n\leq 10\).
分析
首先如果每个点只被允许访问一次,并且指定起点,那么显然是一个最短\(\text{Hamilton}\)路径问题;
第一次读题,我以为是个不指定起点的最短哈密顿路径问题,然后我就\(O(n^{2})\)枚举起点终点,然后套个\(O(2^n*n^{2})\)的状压\(dp\),就是\(O(n^4*2^n)\),后来看题解发现读错题了;对于不指定起点终点的情况来说,可以不用这么做,在指定起点为0的最短哈密顿路径中,我们初始化\(dp[1][0]=0\),其他为\(\infty\),那么不指定起点它可能开始的时候在任意位置,我们就初始化,在任意城市为起点的状态为0,即\(dp[1<<pos][pos]_{pos\in [0,n)}=0\),最后目标是\(\min_{end\in [0,n)}dp[(1<<n)-1][end]\);
那么对于这一题来说,其实将最短哈密顿路径的每个点只允许被经过一次
,变成了每个点至少经过一次,最多经过2次
,那么原来使用2进制,0表示没经过,1表示经过;那么现在使用3进制,0表示没经过,1表示经过一次,2表示经过2次;与2进制不同,3进制不能通过简单位运算取出某一位上的数、对某一位进行取反等一些操作,所以我们需要进行一些预处理,预处理状态\(s\)的第\(k\)位是什么,还需要用到仅走过城市k一次
所表示的状态,还需要处理下这个;
注意代码中的\(status[x]\),在三进制下是怎么表示的,这里不是说它的意义。
代码
1 |
|