Official

E - Magical Ornament Editorial by tatyam


魔法石を頂点、隣り合わせにできる組を辺として、無向グラフとして扱うことにします。

\(K ≤ 17\) と、 \(K\) の制約が非常に小さいことに注目しましょう。
頂点 \(C_1, C_2, \dots, C_K\) のみを見ると、この問題は最短ハミルトン路問題と同じ形をしています。
そこで動的計画法によって効率的に解くことを考えます。

集合 \(C\)\(C = \{C_1, C_2, \dots, C_K\}\)\(S\)\(C\) の部分集合、 \(i\)\(S\) の要素として、

\(dp[S][i] = {}\)( \(S\) の各頂点を含み頂点 \(i\) で終わるパスの長さの最小値 )

とすると、問題の答えは \(\displaystyle \min_{i}\{dp[C][i]\} + 1\) です。
この DP は、\(\text{dist}(i, j)\) を頂点 \(i, j\) 間の距離として、

\(\displaystyle dp[\{i\}][i] = 0\)
\(\displaystyle dp[S][i] = \min_{j}\{dp[S \setminus \{i\}][j] + \text{dist}(i, j)\}\)

の漸化式で ( \(\text{dist}(i, j)\) が分かれば) 下位集合から順に求めることができます。

\(\text{dist}(i, j)\) については、 \(i, j \in C\) であるので、 \(C_1, C_2, \dots, C_K\) を始点とした \(K\) 回の BFS で前計算することができます。

よって、計算量 \(O(2^KK^2+K(N+M))\) でこの問題を解くことができます。

回答例 (C++) : https://atcoder.jp/contests/abc190/submissions/19761405
回答例 (Python) : https://atcoder.jp/contests/abc190/submissions/19825273

posted:
last update: