Kyopro Library
 
読み取り中…
検索中…
一致する文字列を見つけられません
two_sat.hpp
[詳解]
1#include"../../kyopro_library/template.hpp"
2#include"../../kyopro_library/graph/scc.hpp"
3
4/// @brief 2-SAT
5struct TwoSat {
6 TwoSat(int n) { g=vector<vector<int>>(2*n); }
7
8 /// @brief 条件 `i==fi || j==fj` を追加
9 void add(int i, bool fi, int j, bool fj) {
10 // 2i = i が true, 2i+1 = i が false
11 i=2*i+!fi,j=2*j+!fj;
12 // !i -> j, !j -> i
13 g[i^1].push_back(j); g[j^1].push_back(i);
14 }
15
16 /// @brief 2-SATを解く
17 /// @brief 解が存在しないなら空のvectorを返す
18 vector<bool> solve() {
19 auto [mem,ng,gr]=SccDecomposition(g);
20 int n=g.size()/2;
21 vector<bool> ret(n);
22
23 for(int i=0; i<n; i++) {
24 if(gr[i*2]==gr[i*2+1]) return vector<bool>();
25 // 2i(true) が後ろなら i は true
26 ret[i]=gr[i*2]>gr[i*2+1];
27 }
28
29 return ret;
30 }
31
32private:
33 vector<vector<int>> g;
34};
2-SAT
Definition two_sat.hpp:5
TwoSat(int n)
Definition two_sat.hpp:6
vector< bool > solve()
2-SATを解く
Definition two_sat.hpp:18
void add(int i, bool fi, int j, bool fj)
条件 i==fi || j==fj を追加
Definition two_sat.hpp:9