Cod sursa(job #2031955)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 4 octombrie 2017 09:31:18
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>

using namespace std;

struct nod
{
    int low;
    int d;
    int viz;
    vector<int> v;
} v[100005];
int n, m;
int dc = 0;
vector<int> st;
vector< vector<int> > res;

void dfs(int n)
{
    st.push_back(n);
    v[n].d = ++dc;
    v[n].low = v[n].d;
    v[n].viz = 1;
    for(int i = 0; i < v[n].v.size(); i++)
    {
        if(!v[v[n].v[i]].d)
        {
            dfs(v[n].v[i]);
            v[n].low = min(v[n].low, v[v[n].v[i]].low);
        }
        else if(v[v[n].v[i]].viz)
            v[n].low = min(v[n].low, v[v[n].v[i]].low);
    }
    if(v[n].d == v[n].low)
    {
        res.push_back( vector<int>() );
        int aux;
        do
        {
            aux = st.back();
            v[st.back()].viz = 0;
            res.back().push_back(st.back());
            st.pop_back();
        } while(aux != n);
    }
}

int main()
{
    freopen("ctc.in", "r", stdin);
    freopen("ctc.out", "w", stdout);
    int a, b;
    scanf("%d%d", &n, &m);
    for(int i = 0; i < m; i++)
    {
        scanf("%d%d", &a, &b);
        v[a].v.push_back(b);
    }
    for(int i = 1; i <= n; i++)
        if(!v[i].d)
            dfs(i);
    /*for(int i = 1; i <= n; i++)
    {
        printf("%d %d %d\n", i, v[i].low, v[i].d);
    }*/
    printf("%d\n", res.size());
    for(int i = 0; i < res.size(); i++)
    {
        for(int j = 0; j < res[i].size(); j++)
            printf("%d ", res[i][j]);
        printf("\n");
    }
    return 0;

}