強連結成分分解

強連結成分それぞれをvectorにまとめたvviでreturnが来る

scc( 頂点数 、 vviの形のグラフ ) でできる

vector<vector<int>> scc(int n,const vector<vector<int>>& v){
    vector<vector<int>> vv(n);
    for(int i = 0;i < n;i++){
        for(int j = 0;j < v[i].size();j++){
            vv[v[i][j]].push_back(i);
        }
    }
    vector<int> res;
    vector<bool> visited(n,false);
    function<void(int)> f = [&](int pos){
        visited[pos] = true;
        for(int i : v[pos]){
            if(!visited[i])f(i);
        }
        res.push_back(pos);
    };
    for(int i = 0;i < n;i++){
        if(!visited[i]){
            f(i);
        }
    }
    vector<vector<int>> ans;
    visited.assign(n,false);
    for(int i = res.size()-1; i >= 0;i--){
        if(visited[res[i]])continue;
        vector<int> p = {res[i]};
        function<void(int)> d = [&](int pos){
            visited[pos] = true;
            for(int i : vv[pos]){
                if(visited[i])continue;
                p.push_back(i);
                d(i);
            }
        };
        d(res[i]);
        ans.push_back(p);
    }
    return ans;
}