2


0

しばらく探していましたが、2-Satアルゴリズムの実装が見つからないようです。

私は( 厳密に接続されたコンポーネントモジュールを持っている)boostライブラリを使ってcで作業しています。効率的な2-Satプログラムを作成するか、またはcを介して使用するための既存のライブラリーを見つけます。

1 Answer


3


私はあなたがSCCでそれを解決するために2-Sat問題をモデル化する方法を知っていると思います。 varとその否定の扱い方はそれほど洗練されていませんが、短い実装が可能です。0からn-1までのn個の変数の節で、-iは変数iの否定を意味し、のグラフでは同じ(私ははっきりしていますか?)

#include #include #include #include #include #include

typedef std :: pair句。

//Properties of our graph. By default oriented graph
typedef boost :: adjacency_list <>グラフ。

const int nb_vars = 5。

int var_to_node(int var){if(var <0)が返される(-var nb_vars);そうでなければvarを返します。 }

int main(int argc、char ** argv){std :: vector句; clauses.push_back(clause(1,2)); clauses.push_back((2、-4)); clauses.push_back(節(1,4)); clauses.push_back((1,3)節); clauses.push_back((-2,4));

//変数の2倍のノードを持つグラフを作成します。Graph g(nb_vars * 2);

//すべての辺を追加しましょうBOOST_FOREACH(節c、節){int v1 = c.first;} int v2 = c.second; boost :: add_edge(var_to_node(-v1)、var_to_node(v2)、g);

boost :: add_edge(var_to_node(-v2)、var_to_node(v1)、g); }

//すべてのノードは強連結成分に属しますstd :: vector成分(num_vertices(g)); std :: cout << strong_components(g、

//同じSCC boolに//否定を持つ変数があるかどうかを確認しましょう= true; (int i = 0; iの場合