Cod sursa(job #922552)

Utilizator alexandru93moraru alexandru sebastian alexandru93 Data 22 martie 2013 14:03:25
Problema Componente tare conexe Scor 12
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include<fstream>
#include<vector>
#include<queue>
#define maxn 100000
using namespace std;

int N,M;
vector<int> V[maxn];
vector<int> T[maxn];
vector<bool> F;
vector<int> PM;
vector<int> A[maxn];
queue<int> Q;

int count=0;

ifstream f("ctc.in");
ofstream g("ctc.out");

void parcurgere2(int S){
    queue<int> Q2;

    Q2.push(S);

    while(!Q2.empty()){
        int nod=Q2.front();
        Q2.pop();
        for(vector<int>::iterator it=T[nod].begin();it!=T[nod].end();it++)
            if(PM[*it]==-1){
                Q2.push(*it);
                A[count].push_back(*it);
                PM[*it]=1;
                F[*it]=2;
            }
        }
}

void parcurgere1(int S){
    int x;
    F[S]=2;
    PM[S]=-1;
    Q.push(S);

    //A[++count].push_back(S);
    count++;
    while(!Q.empty()){
        int nod=Q.front();
        Q.pop();
        for(vector<int>::iterator it=V[nod].begin();it!=V[nod].end();it++)
            if(!PM[*it]){
                Q.push(*it);
                PM[*it]=-1;
            }
        }
    parcurgere2(S);
}

void citire(){
    int x,y;
    f>>N>>M;
    F.resize(N+1);
    PM.resize(N+1);
    for(int i=0;i<M;i++){
        f>>x>>y;
        V[x].push_back(y);
        T[y].push_back(x);
    }
}

void afis(){
    g<<count<<'\n';
    for(int i=1;i<=count;i++){
        for(vector<int>::iterator it=A[i].begin();it!=A[i].end();it++)
            g<<*it<<' ';
        g<<'\n';
    }
}

int main(){
    citire();
    for(int i=1;i<=N;i++){
        if(!F[i]){
            PM.clear();
            parcurgere1(i);
        }
    }
    afis();
    return 0;
}