vi dfs_num, dfs_low, S, visited;
void tarjanSCC(int u) {
dfs_low[u] = dfs_num[u] = dfsNumberCounter++;
S.push_back(u);
visited[u] = 1;
for (int j = 0; j < (int)AdjList[u].size(); j++) {
ii v = AdjList[u][j];
if (dfs_num[v.first] == UNVISITED)
tarjanSCC(v.first);
if (visited[v.first]) // condition for update
dfs_low[u] = min(dfs_low[u], dfs_low[v.first]); }
if (dfs_low[u] == dfs_num[u]) {
printf("SCC %d:", ++numSCC);
while (1) {
int v = S.back(); S.pop_back(); visited[v] = 0; // why visited[v]=0 is done?
printf(" %d", v);
if (u == v) break; }
printf("\n");
} }
// inside int main()
dfs_num.assign(V, UNVISITED); dfs_low.assign(V, 0); visited.assign(V, 0);
dfsNumberCounter = numSCC = 0;
for (int i = 0; i < V; i++)
if (dfs_num[i] == UNVISITED)
tarjanSCC(i);
//code is from steven and felix book.