Skip to content

Commit a45e808

Browse files
authored
add example usage, fix var names, descriptions on tests
1 parent 2fb1fdb commit a45e808

File tree

2 files changed

+54
-48
lines changed

2 files changed

+54
-48
lines changed

src/graph/2SAT.md

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -103,17 +103,16 @@ In the graph the vertices with indices $2k$ and $2k+1$ are the two vertices corr
103103

104104
```{.cpp file=2sat}
105105
struct TwoSatSolver {
106-
int n;
106+
int n_vars;
107+
int n_vertices;
107108
vector<vector<int>> adj, adj_t;
108109
vector<bool> used;
109110
vector<int> order, comp;
110111
vector<bool> assignment;
111112

112-
// n is the number of variables
113-
TwoSatSolver(int n) : n(n), adj(2 * n), adj_t(2 * n), used(2 * n), order(), comp(2 * n, -1), assignment(n) {
114-
order.reserve(2 * n);
113+
TwoSatSolver(int _n_vars) : n_vars(_n_vars), n_vertices(2 * n_vars), adj(n_vertices), adj_t(n_vertices), used(n_vertices), order(), comp(n_vertices, -1), assignment(n_vars) {
114+
order.reserve(n_vertices);
115115
}
116-
117116
void dfs1(int v) {
118117
used[v] = true;
119118
for (int u : adj[v]) {
@@ -131,24 +130,23 @@ struct TwoSatSolver {
131130
}
132131
}
133132

134-
// m will be the number of vertices in the graph (= 2 * n)
135-
bool solve_2SAT(int m) {
133+
bool solve_2SAT() {
136134
order.clear();
137-
used.assign(m, false);
138-
for (int i = 0; i < m; ++i) {
135+
used.assign(n_vertices, false);
136+
for (int i = 0; i < n_vertices; ++i) {
139137
if (!used[i])
140138
dfs1(i);
141139
}
142140

143-
comp.assign(m, -1);
144-
for (int i = 0, j = 0; i < m; ++i) {
145-
int v = order[m - i - 1];
141+
comp.assign(n_vertices, -1);
142+
for (int i = 0, j = 0; i < n_vertices; ++i) {
143+
int v = order[n_vertices - i - 1];
146144
if (comp[v] == -1)
147145
dfs2(v, j++);
148146
}
149147

150-
assignment.assign(m / 2, false);
151-
for (int i = 0; i < m; i += 2) {
148+
assignment.assign(n_vars, false);
149+
for (int i = 0; i < n_vertices; i += 2) {
152150
if (comp[i] == comp[i + 1])
153151
return false;
154152
assignment[i / 2] = comp[i] > comp[i + 1];
@@ -167,6 +165,17 @@ struct TwoSatSolver {
167165
adj_t[b].push_back(neg_a);
168166
adj_t[a].push_back(neg_b);
169167
}
168+
169+
static void example_usage() {
170+
TwoSatSolver solver(3); // a, b, c
171+
solver.add_disjunction(0, false, 1, true); // a v not b
172+
solver.add_disjunction(0, true, 1, true); // not a v not b
173+
solver.add_disjunction(1, false, 2, false); // b v c
174+
solver.add_disjunction(0, false, 0, false); // a v a
175+
assert(solver.solve_2SAT() == true);
176+
auto expected = vector<bool>{{true, false, true}};
177+
assert(solver.assignment == expected);
178+
}
170179
};
171180
```
172181

test/test_2sat.cpp

Lines changed: 31 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,50 +4,47 @@ using namespace std;
44

55
#include "2sat.h"
66

7-
void setup(int size) {
8-
n = 2 * size;
9-
adj.clear();
10-
adj.resize(n);
11-
adj_t.clear();
12-
adj_t.resize(n);
7+
void test_2sat_example_usage() {
8+
TwoSatSolver::example_usage();
139
}
1410

1511
void test_2sat_article_example() {
16-
setup(3);
17-
add_disjunction(0, 0, 1, 1); // a v not b
18-
add_disjunction(0, 1, 1, 0); // not a v b
19-
add_disjunction(0, 1, 1, 1); // not a v not b
20-
add_disjunction(0, 0, 2, 1); // a v not c
21-
assert(solve_2SAT() == true);
22-
auto expected = vector<bool>{{false, false, false}};
23-
assert(assignment == expected);
12+
TwoSatSolver solver(3); // a, b, c
13+
solver.add_disjunction(0, false, 1, true); // a v not b
14+
solver.add_disjunction(0, true, 1, false); // not a v b
15+
solver.add_disjunction(0, true, 1, true); // not a v not b
16+
solver.add_disjunction(0, false, 2, true); // a v not c
17+
assert(solver.solve_2SAT() == true);
18+
auto expected = vector<bool>{{false, false, false}};
19+
assert(solver.assignment == expected);
2420
}
2521

2622
void test_2sat_unsatisfiable() {
27-
setup(2);
28-
add_disjunction(0, 0, 1, 0); // x v y
29-
add_disjunction(0, 0, 1, 1); // x v not y
30-
add_disjunction(0, 1, 1, 0); // not x v y
31-
add_disjunction(0, 1, 1, 1); // not x v not y
32-
assert(solve_2SAT() == false);
23+
TwoSatSolver solver(2); // a, b
24+
solver.add_disjunction(0, false, 1, false); // a v b
25+
solver.add_disjunction(0, false, 1, true); // a v not b
26+
solver.add_disjunction(0, true, 1, false); // not a v b
27+
solver.add_disjunction(0, true, 1, true); // not a v not b
28+
assert(solver.solve_2SAT() == false);
3329
}
3430

3531
void test_2sat_other_satisfiable_example() {
36-
setup(4);
37-
add_disjunction(0, 0, 1, 1); // a v not b
38-
add_disjunction(0, 1, 2, 1); // not a v not c
39-
add_disjunction(0, 0, 1, 0); // a v b
40-
add_disjunction(3, 0, 2, 1); // d v not c
41-
add_disjunction(3, 0, 0, 1); // d v not a
42-
assert(solve_2SAT() == true);
43-
// two solutions
44-
auto expected_1 = vector<bool>{{true, true, false, true}};
45-
auto expected_2 = vector<bool>{{true, false, false, true}};
46-
assert(assignment == expected_1 || assignment == expected_2);
32+
TwoSatSolver solver(4); // a, b, c, d
33+
solver.add_disjunction(0, false, 1, true); // a v not b
34+
solver.add_disjunction(0, true, 2, true); // not a v not c
35+
solver.add_disjunction(0, false, 1, false); // a v b
36+
solver.add_disjunction(3, false, 2, true); // d v not c
37+
solver.add_disjunction(3, false, 0, true); // d v not a
38+
assert(solver.solve_2SAT() == true);
39+
// two solutions
40+
auto expected_1 = vector<bool>{{true, true, false, true}};
41+
auto expected_2 = vector<bool>{{true, false, false, true}};
42+
assert(solver.assignment == expected_1 || solver.assignment == expected_2);
4743
}
4844

4945
int main() {
50-
test_2sat_article_example();
51-
test_2sat_unsatisfiable();
52-
test_2sat_other_satisfiable_example();
46+
test_2sat_example_usage();
47+
test_2sat_article_example();
48+
test_2sat_unsatisfiable();
49+
test_2sat_other_satisfiable_example();
5350
}

0 commit comments

Comments
 (0)