Cod sursa(job #1991668)

Utilizator anisca22Ana Baltaretu anisca22 Data 17 iunie 2017 23:10:07
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#define NMAX 100005
#define INF (1<<29)
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
int n,m,k;
int low[NMAX],viz[NMAX],c[NMAX];
vector <int> v[NMAX],rsp[NMAX];
stack <int> st;
void dfs(int nod)
{
    viz[nod]=1;
    for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
    {
        int nr=*it;
        if(viz[nr]==0)
        {
            low[nr]=low[nod]+1;
            dfs(nr);
        }
    }
    for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
    {
        int nr=*it;
        if(low[nr]>low[nod])dfs(nr);
        low[nod]=min(low[nod],low[nr]);
    }
}
void rez(int nod,int ind)
{
    st.push(nod);
    c[nod]=1;
    for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
    {
        int nr=*it;
        if(low[nr]==ind && c[nr]==0)rez(nr,ind);
    }
}
int main()
{
    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++)
        low[i]=INF;
    low[1]=1;
    dfs(1);
    for(int i=1;i<=n;i++)
        if(c[i]==0)
            {
                k++;
                rez(i,low[i]);
                while(!st.empty())
                {
                    int nr=st.top();
                    st.pop();
                    rsp[k].push_back(nr);
                }
            }
    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";
    }
    return 0;
}