Kyopro Library
読み取り中…
検索中…
一致する文字列を見つけられません
two_sat.hpp
[詳解]
1
#
include
"../../kyopro_library/template.hpp"
2
#
include
"../../kyopro_library/graph/scc.hpp"
3
4
/// @brief 2-SAT
5
struct
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
32
private
:
33
vector<vector<
int
>> g;
34
};
TwoSat
2-SAT
Definition
two_sat.hpp:5
TwoSat::TwoSat
TwoSat(int n)
Definition
two_sat.hpp:6
TwoSat::solve
vector< bool > solve()
2-SATを解く
Definition
two_sat.hpp:18
TwoSat::add
void add(int i, bool fi, int j, bool fj)
条件 i==fi || j==fj を追加
Definition
two_sat.hpp:9
graph
two_sat.hpp
構築:
1.13.2