int main() { /* Build graph */ dfs_num.assign(n, DFS_WHITE); dfs_low.assign(n,0); visited.assign(n, 0); dfsNumberCounter = numSCC = 0; for (int i = 0; i < n; i++) if (dfs_num[i] == DFS_WHITE) tarjanSCC(i); return 0; }
void tarjanSCC(int u) { dfs_low[u] = dfs_num[u] = dfsNumberCounter++; S.push_back(u); visited[u] = 1; for (int j = 0; j < g[u].size(); j++) { int v = g[u][j]; if (dfs_num[v] == DFS_WHITE) tarjanSCC(v); if (visited[v]) dfs_low[u] = min(dfs_low[u], dfs_low[v]); } if (dfs_low[u] == dfs_num[u]) { cout << "SCC " << ++numSCC << ":"; while (1) { int v = S.back(); S.pop_back(); visited[v] = 0; cout << " " << v; if (u == v) break; } cout << endl; } }
void tarjanSCC(int u){ int v; dfs_low[u] = dfs_num[u] = counter++; S.push_back(u); vis[u] = 1; for(int j=0; j<nadj[u]; j++){ v = adj[u][j]; if(dfs_num[v]==-1) tarjanSCC(v); if(vis[u]) dfs_low[u] = min(dfs_low[u],dfs_low[v]); } if(dfs_low[u]==dfs_num[u]){ printf("SCC %d\n",++numSCC); while(1){ v = s.back(); S.pop_back(); visited[v]=0; printf(" %d",v); if(u==v) break; } printf("\n"); } }