vector> adj; int counter, sccCounter; vector inStack; vector low, idx, s; //idx enthält Index der SCC pro Knoten. void visit(int v) { int old = low[v] = counter++; s.push_back(v); inStack[v] = true; for (auto u : adj[v]) { if (low[u] < 0) visit(u); if (inStack[u]) low[v] = min(low[v], low[u]); } if (old == low[v]) { sccCounter++; for (int u = -1; u != v;) { u = s.back(); s.pop_back(); inStack[u] = false; idx[u] = sccCounter - 1; }}} void scc() { inStack.assign(ssize(adj), false); low.assign(ssize(adj), -1); idx.assign(ssize(adj), -1); counter = sccCounter = 0; for (int i = 0; i < ssize(adj); i++) { if (low[i] < 0) visit(i); }}