-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsat.h
73 lines (69 loc) · 1.57 KB
/
sat.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
int neg(int var) {
return var ^ 1;
}
struct SAT {
int N;
SAT() : N(0) {}
V(VI) adj;
VI idx, lowlink, onStack, ans;
stack<int> stack;
int i;
int addVariable() {
N += 2;
return N - 2;
}
void imply(int a, int b) {
adj.resize(N);
adj[a].PB(b);
adj[neg(b)].PB(neg(a));
}
bool fail;
void dfs(int v) {
idx[v] = i;
lowlink[v] = i;
i++;
stack.push(v);
onStack[v] = true;
FOR(it, adj[v]) {
int w = *it;
if (idx[w] < 0) {
dfs(w);
if (fail) return;
}
if (onStack[w]) {
lowlink[v] = min(lowlink[v], lowlink[w]);
}
}
if (lowlink[v] == idx[v]) {
// found a new strongly component
int w;
set<int> comp;
do {
// w is in this strongly component
w = stack.top(); stack.pop();
onStack[w] = false;
if (comp.count(neg(w))) {
fail = true;
return;
}
comp.insert(w);
if (!ans[neg(w)]) ans[w] = true;
} while(w != v);
}
}
bool solve() {
i = 0;
onStack = VI(N);
idx = VI(N, -1);
lowlink = VI(N);
ans = VI(N);
fail = false;
REP(v, N) {
if (idx[v] < 0) {
dfs(v);
if (fail) return false;
}
}
return true;
}
};