Cod sursa(job #1991751)

Utilizator anisca22Ana Baltaretu anisca22 Data 18 iunie 2017 12:20:41
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#define NMAX 100005
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
int n,m,k,ind;
int low[NMAX],inst[NMAX],h[NMAX];
vector <int> v[NMAX],rsp[NMAX];
stack <int> st;
void read()
{
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        fin>>x>>y;
        v[x].push_back(y);
    }
    for(int i=1;i<=n;i++)h[i]=-1;
}
void write()
{
    fout<<k<<"\n";
    for(int i=1;i<=k;i++)
    {
        for(vector<int>::iterator it=rsp[i].begin();it!=rsp[i].end();it++)
            fout<<*it<<" ";
        fout<<"\n";
    }
}
void ctc(int nod)
{
    h[nod]=low[nod]=ind;
    ind++;
    st.push(nod);
    inst[nod]=1;
    for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
    {
        int nr=*it;
        if(h[nr]==-1)
        {
            ctc(nr);
            low[nod]=min(low[nod],low[nr]);
        }
        else if(inst[nr])low[nod]=min(low[nod],low[nr]);
    }
    if(low[nod]==h[nod])
    {
        k++;
        while(st.top()!=nod)
        {
            rsp[k].push_back(st.top());
            inst[st.top()]=0;
            st.pop();
        }
        rsp[k].push_back(st.top());
        inst[st.top()]=0;
        st.pop();
    }
}
int main()
{
    read();
    ind=1;
    for(int i=1;i<=n;i++)
        if(h[i]==-1)
            ctc(i);
    write();
    return 0;
}