From 71beea3dcfc2a5d0a5ae0a8f163580236b13a788 Mon Sep 17 00:00:00 2001 From: Noobie99 Date: Fri, 15 Sep 2023 17:09:02 +0200 Subject: shorten scc code + clear before each call --- graph/scc.cpp | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/graph/scc.cpp b/graph/scc.cpp index 17f4a96..1716add 100644 --- a/graph/scc.cpp +++ b/graph/scc.cpp @@ -1,24 +1,19 @@ -vector> adj; - +vector> adj, sccs; int counter, sccCounter; vector inStack; -vector> sccs; // idx enthält den Index der SCC pro Knoten. -vector d, low, idx, s; +vector low, idx, s; void visit(int v) { - d[v] = low[v] = counter++; + int old = low[v] = counter++; s.push_back(v); inStack[v] = true; for (auto u : adj[v]) { - if (d[u] < 0) { - visit(u); - low[v] = min(low[v], low[u]); - } else if (inStack[u]) { - low[v] = min(low[v], low[u]); - }} + if (low[u] < 0) visit(u); + if (inStack[u]) low[v] = min(low[v], low[u]); + } - if (d[v] == low[v]) { + if (old == low[v]) { sccs.push_back({}); int u; do { @@ -31,11 +26,11 @@ void visit(int v) { void scc() { inStack.assign(sz(adj), false); - d.assign(sz(adj), -1); low.assign(sz(adj), -1); idx.assign(sz(adj), -1); + sccs.clear(); counter = sccCounter = 0; for (int i = 0; i < sz(adj); i++) { - if (d[i] < 0) visit(i); + if (low[i] < 0) visit(i); }} -- cgit v1.2.3