ABC338 F
这道题与传统的旅行商问题并不一样:旅行商问题要求每个点不能重复经过;而本题所求的每个点都可以重复经过。若直接采用旅行商的方法直接状压 \(dp\),是有后效性的,因此需要转换思路。
精妙的发现出来了:虽然点可以重复经过,但可以将这个答案用另一种形式表示,使得表达形式中的每一项均不同,进而可以采用旅行商的方式来解决问题。将这个路径表示 \(x_{1}\) -> \(x_{2}\) -> \(...\) -> \(x_{k}\),那么这个路径中一定包含了 \(1到n\) 内的所有点。将 \(1到n\) 单独提取出来,就组成了一个排列,于是这个最短路可以表示成:\(p_{1}\) -> \(p_{2}\) -> \(...\) -> \(p_{n}\)。显然,对于其中任意一对 \(p_{i}\) -> \(p_{j}\),这段距离应该为 \(i\) 到 \(j\) 的最短路,即 \(dist[i][j]\)。这样,这条最短路就可以表示成: \(dist[p1][p2]\) + \(dist[p2][p3]\) + \(...\) + \(dist[p_{n-1}][p_{n}]\)。这样的转化相当于每个点又只经过了一次,只是转移不再是边权,而是两点之间的最短路。于是,正解便是转移为两点间最短路的旅行商问题。
code