diff options
| author | mzuenni <michi.zuendorf@gmail.com> | 2022-06-27 17:19:28 +0200 |
|---|---|---|
| committer | mzuenni <michi.zuendorf@gmail.com> | 2022-06-27 17:19:28 +0200 |
| commit | 5ab8a5088b729a9953b8dff1b2a985dc8fb2098b (patch) | |
| tree | ed40d6936c0e9eee40ba62751cbf99ecddbaddc2 /graph/scc.cpp | |
| parent | adabbad9c51cf7cd3874bfde8eac1fbcf84fec10 (diff) | |
updated tcr
Diffstat (limited to 'graph/scc.cpp')
| -rw-r--r-- | graph/scc.cpp | 38 |
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); +}} |
