summaryrefslogtreecommitdiff
path: root/graph/scc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'graph/scc.cpp')
-rw-r--r--graph/scc.cpp38
1 files changed, 19 insertions, 19 deletions
diff --git a/graph/scc.cpp b/graph/scc.cpp
index 9eb0881..b21d544 100644
--- a/graph/scc.cpp
+++ b/graph/scc.cpp
@@ -1,17 +1,17 @@
-// Laufzeit: O(|V|+|E|)
+vector<vector<int>> adjlist;
+
int counter, sccCounter;
-vector<bool> visited, inStack;
-vector< vector<int> > adjlist;
-vector<int> d, low, sccs; // sccs enthält den Index der SCC pro Knoten.
-stack<int> s;
+vector<bool> inStack;
+vector<vector<int>> sccs;
+// idx enthält den Index der SCC pro Knoten.
+vector<int> d, low, idx, s;
void visit(int v) {
- visited[v] = true;
d[v] = low[v] = counter++;
- s.push(v); inStack[v] = true;
+ s.push_back(v); inStack[v] = true;
for (auto u : adjlist[v]) {
- if (!visited[u]) {
+ if (d[u] < 0) {
visit(u);
low[v] = min(low[v], low[u]);
} else if (inStack[u]) {
@@ -19,23 +19,23 @@ void visit(int v) {
}}
if (d[v] == low[v]) {
+ sccs.push_back({});
int u;
do {
- u = s.top(); s.pop(); inStack[u] = false;
- sccs[u] = sccCounter;
+ u = s.back(); s.pop_back(); inStack[u] = false;
+ idx[u] = sccCounter;
+ sccs[sccCounter].push_back(u);
} while (u != v);
sccCounter++;
}}
void scc() {
- visited.assign(adjlist.size(), false);
- d.assign(adjlist.size(), -1);
- low.assign(adjlist.size(), -1);
- inStack.assign(adjlist.size(), false);
- sccs.resize(adjlist.size(), -1);
+ inStack.assign(sz(adjlist), false);
+ d.assign(sz(adjlist), -1);
+ low.assign(sz(adjlist), -1);
+ idx.assign(sz(adjlist), -1);
counter = sccCounter = 0;
- for (int i = 0; i < (int)adjlist.size(); i++) {
- if (!visited[i]) {
- visit(i);
-}}}
+ for (int i = 0; i < sz(adjlist); i++) {
+ if (d[i] < 0) visit(i);
+}}