ビットDP(巡回セールスマン TSP)

訪問済みの都市集合をビット列で表し、Held–Karp の漸化式 dp[S][v] を 1 都市ずつ埋めて最短巡回路を復元します。

6
7
速度
状態数 2ⁿ × n
埋めた dp エントリ
現在の集合 S
最短巡回路長
dp[S][v] = min over u∈S\{v} ( dp[S\{v}][u] + dist(u, v) )
都市の地図(都市0=スタート赤・最短巡回路を緑で復元) ドラッグで移動
dp 表(行=訪問集合 S, 列=現在都市 v)/橙=埋まった, 青=計算中
巡回セールスマン問題(TSP)は「全都市をちょうど 1 回ずつ訪れて出発点に戻る最短経路」を求める問題です。素朴に全順列を試すと (n−1)! 通りで爆発します。
ビットDP(Held–Karp 法)は「どの都市を訪問済みか」を n ビットの集合 S で表し、dp[S][v] =「集合 S の都市を訪れて今 v にいるときの最短距離」を小さい集合から順に埋めます。ビットが 1 つ立つ=都市を 1 つ追加、という遷移です。
計算量は O(2ⁿ · n²)。全順列の O(n!) より圧倒的に速い一方、状態数 2ⁿ がメモリを食うので n を上げると一気に重くなる ── スライダーで体感しましょう。

いま何が起きている?

ここがポイント