問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
巡回セールスマン問題とは、都市の集合と各都市間の距離が与えられ、全都市をちょうど1回ずつ訪れたのち出発した都市に戻ってくるような経路 (巡回路) のうち最も短いものを求める問題です。
ここでは、巡回セールスマン問題を動的計画法で解くことを考えます。この解法では、都市の集合をビット列で表します。まずは、この表現をマスターしましょう。
都市の個数を n とし、各都市を 0, 1, ..., n-1 で表すことにします。また、都市の集合を S とします。このとき、都市 s_i が S に含まれているなら右から i 桁目は 1, 含まれていないなら 0
とすると、都市の集合としてありうるもの全てを、長さ n のビット列 (0 以上 2^n-1 以下の整数) で表すことができます。
例えば、n = 4 のとき, 集合 S = {0, 3} のビット列による表現は1001
で、整数値としては9
となります。n = 6 のとき, 集合 S = {0, 1, 2, 3, 5} のビット列による表現は101111
で、整数値としては47
となります。
都市の個数 n と都市の集合 S が与えられるので、集合 S のビット列による表現を求め、その整数値を出力してください。
n k
s_1 ... s_k
都市の集合 S = {s_1, ... , s_k} のビット列による表現を求め、その整数値を出力してください。
すべてのテストケースにおいて、以下の条件をみたします。
・ 入力はすべて整数
・ 1 ≦ n ≦ 16
・ 0 ≦ k ≦ n
・ 0 ≦ s_i ≦ n-1 (1 ≦ i ≦ k)
・ i ≠ j ならば s_i ≠ s_j
6 5
3 5 0 2 1
47