Cod sursa(job #942457)

Utilizator Pcosmin93Posteuca Cosmin Pcosmin93 Data 22 aprilie 2013 17:38:08
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 4.35 kb
#include<iostream>
#include<vector>
#include<fstream>

#define MAX 100000
#define MAX_comp 4000

using namespace std;

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

int nod_plecare,nr_comp_conexe=0;
vector <int> graf[MAX],comp_conexe[MAX_comp];

int verificare(int linie,int val ){

    unsigned int i;

    for( i = 0; i < comp_conexe[linie].size(); i++)
        if(comp_conexe[linie][i]==val)
            return 1;

    return 0;
}

int ctc( int nod ,int viz[MAX]){


    unsigned int i,j;
    int gasire=0,nod_intermediar,verifica;

    viz[nod]=1;

    for ( i = 0; i < graf[nod].size(); i++ )
        if((nod!=graf[nod][i])&&(graf[nod][i]==nod_plecare)){
            for( j = 0 ; j < graf[nod].size(); j++ )
                if((nod!=graf[nod][j])&&(graf[nod][j]!=nod_plecare))
                    if(viz[graf[nod][j]]==0){

                        nod_intermediar=nod_plecare;
                        nod_plecare=nod;
                        gasire=ctc(graf[nod][j],viz);
                        nod_plecare=nod_intermediar;

                        if(gasire==1){
                            verifica = verificare(nr_comp_conexe,graf[nod][j]);
                            if(verifica==0)
                                comp_conexe[nr_comp_conexe].push_back(graf[nod][j]);
                        }
                    }
            verifica = verificare(nr_comp_conexe,nod);
            if(verifica==0)
                comp_conexe[nr_comp_conexe].push_back(nod);
            return 1;
           }

        else
            if(viz[graf[nod][i]]==0){
               // nod_plecare=graf[nod][i];
                gasire=ctc(graf[nod][i],viz);
                //nod_plecare=nod;
                if(gasire==1){

                        //for( j = 0 ; j < nr_comp_conexe; j++ )
                            //for( k = 0 ; k < comp_conexe[j].size(); k++ )
                                //if(comp_conexe[j][k]==i)
                    verifica = verificare(nr_comp_conexe,nod);
                    if(verifica==0)
                        comp_conexe[nr_comp_conexe].push_back(nod);
                    return 1;
                }
            }
    return 0;
}

void afisare(){

    unsigned int i;
    int j;

    out<<nr_comp_conexe<<endl;

    for( j = 0 ; j < nr_comp_conexe ; j++ ){
        for( i = 0; i < comp_conexe[j].size(); i++)
            out<<comp_conexe[j][i]<<" ";
        out<<endl;
    }
}

/*int reuniune(){

    int i,ok,ok1,nr_comp_conexe1,p,l;
    unsigned int j,k,s;

    nr_comp_conexe1=nr_comp_conexe;

    for(p = 0 ; p < nr_comp_conexe1 ; p++)
    for( i = p+1 ; i < nr_comp_conexe1; i++){
        ok=0;
        for( j = 0 ; j < comp_conexe[p].size(); j++ )
            for( k = 0 ; k < comp_conexe[i].size() ; k++ )
                if(comp_conexe[p][j]==comp_conexe[i][k])
                    ok++;
        if(ok!=0){
            for( j = 0 ; j < comp_conexe[i].size(); j++ ){
                ok1=0;
                for( k = 0 ; k < comp_conexe[p].size() ; k++ )
                    if(comp_conexe[i][j]==comp_conexe[p][k])
                        ok1++;
                if(ok1==0)
                    comp_conexe[p].push_back(comp_conexe[i][j]);
            }
            for( l = i+1; l < nr_comp_conexe1; l++){

                comp_conexe[l-1].clear();

                for( s = 0 ; s < comp_conexe[l].size() ; s++ )
                    comp_conexe[l-1].push_back(comp_conexe[l][s]);

            }
            comp_conexe[nr_comp_conexe1-1].clear();
            nr_comp_conexe1--;
        }

    }
    return nr_comp_conexe1;
}*/

int main(){

    int n,m,x,y,viz[MAX],exista,ok,i,j,p;
    unsigned int k;

    in>>n>>m;

    for( i = 1; i <= m; i++){

        in>>x>>y;
        graf[x].push_back(y);

    }

    for( i = 1 ; i <= n ; i++)
        viz[i]=0;

    for( i = 1 ; i <= n ; i++ ){
        exista=0;
        for( p = 1 ; p <= n ; p++){
            viz[p]=0;
    }

        for( j = 0 ; j < nr_comp_conexe; j++ )
            for( k = 0 ; k < comp_conexe[j].size(); k++ )
                if(comp_conexe[j][k]==i)
                    exista=1;

        if(exista==0){
            nod_plecare=i;
            ok=ctc(i,viz);
            if(ok==1){
                nr_comp_conexe++;
            }
        }

    }

    afisare();

    return 0;
}