Cod sursa(job #1379507)

Utilizator horatiu11Ilie Ovidiu Horatiu horatiu11 Data 6 martie 2015 18:11:06
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
//horatiu11
# include <cstdio>
# include <vector>
# include <stack>
# define nmax 100001
using namespace std;
int n,m,x,y,l,sol,Ind[nmax],Min_Ind[nmax];
vector <int>G[nmax],Rez[nmax];
stack <int>st;
bool viz[nmax];
inline void dfs(int x)
{
    int val;
    vector <int>::iterator it;
    ++l;
    Ind[x]=Min_Ind[x]=l;
    st.push(x);
    viz[x]=true;
    for(it=G[x].begin();it!=G[x].end();++it)
        if(!Ind[*it])
        {
            dfs(*it);
            Min_Ind[x]=min(Min_Ind[x],Min_Ind[*it]);
        }
        else if(viz[*it])Min_Ind[x]=min(Min_Ind[x],Min_Ind[*it]);
    if(Ind[x]==Min_Ind[x])
    {
        ++sol;
        do{
            val=st.top();st.pop();
            viz[val]=false;
            Rez[sol].push_back(val);
        }while(x!=val);
    }
}
int main()
{
    int i;
    vector <int>::iterator it;
    freopen("ctc.in","r",stdin);
    freopen("ctc.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d",&x,&y);
        G[x].push_back(y);
    }
    for(i=1;i<=n;++i)
        if(!Ind[i])
            dfs(i);
    printf("%d\n",sol);
    for(i=1;i<=sol;++i)
    {
        for(it=Rez[i].begin();it!=Rez[i].end();++it)
            printf("%d ",*it);
        printf("\n");
    }
    return 0;
}