summaryrefslogtreecommitdiff
path: root/content/graph
diff options
context:
space:
mode:
authorGloria Mundi <gloria@gloria-mundi.eu>2026-03-19 10:04:19 +0100
committerGloria Mundi <gloria@gloria-mundi.eu>2026-03-19 10:04:19 +0100
commitfd034dbe8d454c4dd36da50cdb835970255b78da (patch)
tree1fdd371ea5401c1fc86164dd421c5141607b1a6e /content/graph
parent092f128deb362b2899baba12ee28ee280eb0a6e1 (diff)
parentfbd9bfb4c17cfaa60465da0df468f1171f8ff776 (diff)
merge mzuenni changes
Diffstat (limited to 'content/graph')
-rw-r--r--content/graph/2sat_amo.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/content/graph/2sat_amo.cpp b/content/graph/2sat_amo.cpp
new file mode 100644
index 0000000..d50e77d
--- /dev/null
+++ b/content/graph/2sat_amo.cpp
@@ -0,0 +1,38 @@
+constexpr int var(int i) {return i << 1;} // use this!
+struct sat2 {
+ int n; // + scc variablen
+ vector<int> sol;
+ sat2(int vars) : n(vars*2), adj(n) {}
+
+ void addImpl(int a, int b) {
+ adj[a].push_back(b);
+ adj[1^b].push_back(1^a);
+ }
+ void addEquiv(int a, int b) {addImpl(a, b); addImpl(b, a);}
+ void addOr(int a, int b) {addImpl(1^a, b);}
+ void addXor(int a, int b) {addOr(a, b); addOr(1^a, 1^b);}
+ void addTrue(int a) {addImpl(1^a, a);}
+ void addFalse(int a) {addTrue(1^a);}
+ void addAnd(int a, int b) {addTrue(a); addTrue(b);}
+ void addNand(int a, int b) {addOr(1^a, 1^b);}
+
+ bool solve() {
+ scc(); //scc code von oben
+ sol.assign(n, -1);
+ for (int i = 0; i < n; i += 2) {
+ if (idx[i] == idx[i + 1]) return false;
+ sol[i] = idx[i] < idx[i + 1];
+ sol[i + 1] = !sol[i];
+ }
+ return true;
+ }
+};
+void atMostOne(const vector<ll>& vars) {
+ int k = n / 2;
+ n += 2 * sz(vars);
+ adj.resize(n);
+ for (int i = 0; i + 1 < sz(vars); i++) {
+ addImpl(vars[i], var(k+i));
+ addImpl(var(k+i), var(k+i+1));
+ addImpl(var(k+i), vars[i+1] ^ 1);
+}}