Cod sursa(job #2237535)

Utilizator danielsociuSociu Daniel danielsociu Data 2 septembrie 2018 11:09:20
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <vector>
std::ifstream cin("ctc.in");
std::ofstream cout("ctc.out");
#define maxn 200020
#define inf 50000
using namespace std;
vector <int> Gi[maxn],Go[maxn],G[maxn],discovered;
int N,M;
int used[maxn],where[maxn];

void mark_plus(int x){ //mark with +
    used[x]=1;
    for(vector <int>::iterator it=Go[x].begin(); it!=Go[x].end();it++)
        if(!used[*it])
            mark_plus(*it);
    discovered.push_back(x);
}

void mark_minus(int x, int cnt){
    where[x]=cnt;
    for(vector <int>::iterator it=Gi[x].begin(); it!=Gi[x].end();it++)
        if(!where[*it])
            mark_minus(*it,cnt);
}

int main()
{
    int x,y,cnt=1;
    cin>>N>>M;
    for(;M--;){
        cin>>x>>y;
        Go[x].push_back(y);
        Gi[y].push_back(x);
    }

    for(int i=1;i<=N;i++)
        if(!used[i])
            mark_plus(i);

    for(;discovered.size();discovered.pop_back()){
        if(!where[discovered.back()]){
            mark_minus(discovered.back(),cnt);
            cnt++;
        }
    }
    for(int i=1;i<=N;++i)
        G[where[i]].push_back(i);
    cout<<cnt-1<<'\n';
    for (int i=1;i<=N;++i) {
        for (vector <int>::iterator it=G[i].begin();it!=G[i].end();++it)
            cout<<*it<<" ";
        cout << '\n';
    }

}