Cod sursa(job #1425145)

Utilizator dinuandAndrei-Mario Dinu dinuand Data 26 aprilie 2015 21:02:30
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
/* Tarjan */
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>

#define MAXN 100001
#define undefined -1

using namespace std;
using Graph = vector<vector<int> >;

Graph G(MAXN);
vector<int> index(MAXN, undefined);
vector<int> lowlink(MAXN);
vector<bool> onstack(MAXN);
int N, M;

void tarjan(int source, 
            int& current_idx, 
            stack<int>& st,
            vector<vector<int> > &stronglyCtc)
{
    index[source] = lowlink[source] = current_idx;
    current_idx += 1;
    st.emplace(source);
    onstack[source] = true;

    for (auto &node : G[source])
        if (index[node] == undefined) {
            tarjan(node, current_idx, st, stronglyCtc);
            lowlink[source] = min(lowlink[source], lowlink[node]);
        } else if (onstack[node])
            lowlink[source] = min(lowlink[source], index[node]);

    if (lowlink[source] == index[source]) {
        vector<int> comp;
        int node;
        do {
            node = st.top();
            st.pop();
            comp.emplace_back(node);
            onstack[node] = false;
        } while (!st.empty() && node != source);

        stronglyCtc.emplace_back(comp);
    }
}

int main()
{
    ifstream in("ctc.in");
    ofstream out("ctc.out");

    in >> N >> M;
    for (int i = 1; i <= M; i++) {
        int x, y;
        in >> x >> y;
        G[x].push_back(y);
    }

    vector<vector<int> > stronglyCtc;
    int start_idx = 1;
    stack<int> st;

    for (int node = 1; node <= N; node++)
        if (index[node] == undefined)
            tarjan(node, start_idx, st, stronglyCtc);

    int ctc_number = stronglyCtc.size();
    out << ctc_number<< '\n';
    for (int i = 0; i < ctc_number; i++) {
        for (auto &node : stronglyCtc[i])
            out << node << " ";
        out << '\n';
    }

    return 0;
}