Cod sursa(job #922255)

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

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

int count=0;

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

int parcurgere2(int S,int F){
    bool *Viz=new bool[N];
    Viz[S]=true;
    queue<int> Q2;

    Q2.push(S);

    while(!Q2.empty()){
        int nod=Q2.front();
        Q2.pop();
        for(vector<int>::iterator it=V[nod].begin();it!=V[nod].end();it++)
            if(!Viz[*it]){
                Q2.push(*it);
                Viz[*it]=true;
                if(*it==F){
                    //delete[] Viz;
                    return 1;
                }
            }
        }
    //delete[] Viz;
    return 0;
}

void parcurgere1(int S){
    int x;
    bool *Viz=new bool[N];
    Viz[S]=true;
    F[S]=true;
    Q.push(S);

    A[++count].push_back(S);

    while(!Q.empty()){
        int nod=Q.front();
        Q.pop();
        for(vector<int>::iterator it=V[nod].begin();it!=V[nod].end();it++)
            if(!Viz[*it]){
                int x=*it;
                Q.push(x);
                Viz[x]=true;
                if(parcurgere2(x,S)&&!F[x]){
                    A[count].push_back(x);
                    F[x]=true;
                }
            }
        }
//delete[] Viz;
}

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

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])
            parcurgere1(i);
    }
    afis();
    return 0;
}