FindSCC_Tarjan's

#include <cstdio>
#include <vector>
#include <stack>
#include <bitset>
using namespace std;

#define MAX 100
#define INF 2147483647

vector<int> adjList[MAX+7], SCC[MAX+7];
int V, dfs_low[MAX+7],dfs_num[MAX+7],iterCount, cnt;
bitset<MAX+7> visited;
stack<int> S;

void process(int u)
{
    dfs_low[u]=dfs_num[u]=iterCount++;
    visited[u]=true;
    S.push(u);

    int v;
    for(int i=0;i<(int)adjList[u].size();i++)
    {
        v=adjList[u][i];

        if(dfs_num[v]==INF) process(v);
        if(visited[v]) dfs_low[u]=min(dfs_low[u],dfs_low[v]);
    }

    if(dfs_low[u]!=dfs_num[u]) return;

    do
    {
        v=S.top(), S.pop();
        SCC[cnt].push_back(v);

        visited[v]=false;

    } while(u!=v);

    cnt++;
}

void init()
{
    iterCount=cnt=0;
    for(int u=0;u<=V;u++) adjList[u].clear(),SCC[u].clear(), dfs_num[u]=dfs_low[u]=INF;
    visited.reset();
    S=stack<int>();
}

int main()
{
    for(int u=0;u<V;u++) if(dfs_num[u]==INF) process(u);
    
    return 0;
}