2-SATを想定解とする問題をyukicoderで出題しました。
No.470 Inverse S+T Problem - yukicoder
想定解通りの2-SAT解法とは別に、計算量のよく分からない探索を結構通されてしまいました。
探索解の中に正当なものがあるのか、調べていたところ2-SATを暗黙的に解いている提出が見つかりました。
たとえばヘクトさんの提出です。
その解き方というのが、Wikipediaの2-SATの解法の一つとして載っているLimited backtrakingです。
2-satisfiability - Wikipedia
http://epubs.siam.org/doi/abs/10.1137/0205048
例を用いて大雑把に説明します。
が充足可能か調べましょう。
真であると分かったリテラルの集合をで表します。
まず適当な変数を選び(とします)真だと仮定します。()
は偽になるので、このリテラルを含む節では、もう片方が真になる必要があります。
1つめの節からにを加えます。
2つめの節からにを加えます。
ここでとなり、矛盾が見つかりました。
今度はが偽だと仮定します。()
を含む節に注目します。
4つめの節からにを加えます。
を含む節は1つだけです。新たにに加わったに対して、を含み、真であることが確定していない節に注目します。
5つめの節からにを加えます。
これで()になりました。これ以上に追加することもできませんし、矛盾もみつかりませんでした。
に含まれているリテラルを含むような節は、残りの変数の値によらず真になります。
そうでない節は、に出てくる変数を含みません。この例では、が余っています。
残った小さな問題についてこの手続を繰り返していきます。最終的に節が無くなれば残りの変数は適当に決めてよいです。
もし部分的な式が充足不能ならば全体も充足不能ですし、部分的な式が充足可能ならばいままでに確定した真偽の割り当てと合わせて全体が充足可能です。
ある程度無駄を省けば計算量はになると思います(nが変数の数,cが節の数)。
このアプローチでも工夫すると線形時間で解けるらしいです。