Cod sursa(job #1695682)

Utilizator AcuasPopescu Nicolae-Aurelian Acuas Data 27 aprilie 2016 17:29:43
Problema Componente tare conexe Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <vector>
#define NMAX 100005
using namespace std;
ifstream cin("ctc.in");
ofstream cout("ctc.out");
vector<int> a[NMAX],b[NMAX];
int n,m,viz1[NMAX],viz2[NMAX],marcate[NMAX],nrc;
void citire(){
    int i;
    cin>>n>>m;
    int x,y;
    for(i=1;i<=m;i++){
        cin>>x>>y;
        a[x].push_back(y);
        b[y].push_back(x);
    }
}
void DFSP(int x){
    if(viz1[x]==0){
        viz1[x]=1;
        vector<int>::iterator it;
        for(it=a[x].begin();it!=a[x].end();++it)
            DFSP(*it);
    }
}
void DFSM(int x){
    if(viz2[x]==0){
        viz2[x]=1;
        //cout<<x<<' ';
        vector<int>::iterator it;
        for(it=b[x].begin();it!=b[x].end();++it)
            DFSM(*it);
    }
}
int main(){
    citire();
    int i,j;
    for(i=1;i<=n;i++){
        if(marcate[i]==0){
            for(j=1;j<=n;j++)
                viz1[j]=viz2[j]=0;
            DFSP(i);
            DFSM(i);
            ++nrc;
            for(j=1;j<=n;j++)
                if(viz1[j]==1&&viz2[j]==1)
                    marcate[j]=nrc;
        }
    }
    cout<<nrc<<'\n';
    for(i=1;i<=nrc;i++){
        for(j=1;j<=n;j++)
            if(marcate[j]==i)
                cout<<j<<' ';
        cout<<'\n';
    }
    return 0;
}