Cod sursa(job #1164676)

Utilizator misinozzz zzz misino Data 2 aprilie 2014 11:28:04
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<fstream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<deque>
#define N 100100
using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
int n,m,i,ce,nrcc,nrctc,x,y,viz[N];
deque<int>dq;
vector<int>v[N],sol[N],t[N];
inline void dfs(int x){
    viz[x]=nrcc;
    for(vector<int>::iterator it=v[x].begin();it!=v[x].end();++it)
    if(!viz[*it])
    dfs(*it);
    dq.push_back(x);
}
inline void dfs2(int x){
    viz[x]=0;
    sol[nrctc].push_back(x);
    for(vector<int>::iterator it=t[x].begin();it!=t[x].end();++it)
    if(viz[*it]==ce)
    {
        dfs2(*it);
    }
}
int main()
{
    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>x>>y;
        v[x].push_back(y);
        t[y].push_back(x);
    }
    for(i=1;i<=n;++i)
    if(!viz[i])
    {
        ++nrcc;
        dfs(i);
    }
    while(!dq.empty())
    {
        while(!dq.empty()&&!viz[dq.back()])
        dq.pop_back();
        if(dq.empty())
        break;
        ++nrctc;
        ce=viz[dq.back()];
        dfs2(dq.back());
    }
    g<<nrctc<<'\n';
    for(i=1;i<=nrctc;++i)
    {
        sort(sol[i].begin(),sol[i].end());
        for(vector<int>::iterator it=sol[i].begin();it!=sol[i].end();++it)
        g<<*it<<' ';
        g<<'\n';
    }
    return 0;
}