summaryrefslogtreecommitdiff
path: root/sonstiges/2sat.cpp
diff options
context:
space:
mode:
authorpjungeblut <paul.jungeblut@gmail.com>2014-10-26 13:02:53 +0100
committerpjungeblut <paul.jungeblut@gmail.com>2014-10-26 13:02:53 +0100
commit0550627fade1c01d6b90907de198ca13d34db9d9 (patch)
tree0147b497c2b2772c7850f413e4777c9abdb5fc27 /sonstiges/2sat.cpp
parent0b40aa3bb5c635f253d300e8e2885f751848bed8 (diff)
adding 2-SAT
Diffstat (limited to 'sonstiges/2sat.cpp')
-rw-r--r--sonstiges/2sat.cpp63
1 files changed, 63 insertions, 0 deletions
diff --git a/sonstiges/2sat.cpp b/sonstiges/2sat.cpp
new file mode 100644
index 0000000..627e484
--- /dev/null
+++ b/sonstiges/2sat.cpp
@@ -0,0 +1,63 @@
+vector< vector<int> > adjlist; //adjazenzliste
+vector<int> sccs; //speichert die gefundenen SCCs
+vector<bool> visited; //welcher Knoten ist schon besucht worden (in der DFS)
+vector<bool> inStack; //ist Knoten gerade im Stack
+vector<int> d; //discovery time
+vector<int> low; //wie weit hoch geht's im Tiefensuchbaum
+int counter; //Zaehler fuer discovery time
+stack<int> st; //der Stack
+int sccCounter; //Zaehler fuer SCCs
+
+//Tiefensuche, die starke Zusammenhangskomponenten findet
+void visit(int v) {
+ visited[v] = true;
+ d[v] = counter;
+ low[v] = counter;
+ counter++;
+ st.push(v);
+ inStack[v] = true;
+
+ for (int i = 0; i < (int)adjlist[v].size(); i++) {
+ int w = adjlist[v][i];
+
+ if (!visited[w]) {
+ visit(w);
+ low[v] = min(low[v], low[w]);
+ } else if (inStack[w]) {
+ low[v] = min(low[v], low[w]);
+ }
+ }
+
+ if (low[v] == d[v]) {
+ int next;
+ do {
+ next = st.top();
+ st.pop();
+ sccs[next] = sccCounter;
+ inStack[next] = false;
+ } while (next != v);
+
+ sccCounter++;
+ }
+}
+
+void solve() {
+ //adjlist initialisieren
+ //(a || b) wird zu (!a => b) und (!b => a)
+
+ visited.clear(); visited.assign(adjlist.size(), false);
+ inStack.clear(); inStack.assign(adjlist.size(), false);
+ d.clear(); d.assign(adjlist.size(), false);
+ low.clear(); low.assign(adjlist.size(), false);
+ sccs.clear(); sccs.resize(adjlist.size());
+
+ counter = 0;
+ sccCounter = 0;
+ for (i = 0; i < (int)adjlist.size(); i++) {
+ if (!visited[i]) {
+ visit(i);
+ sccCounter++;
+ }
+ }
+ // genau dann loesbar, wenn keine Variable in gleicher SCC wie Negation ist
+} \ No newline at end of file