Cod sursa(job #942405)

Utilizator Pcosmin93Posteuca Cosmin Pcosmin93 Data 22 aprilie 2013 12:13:34
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.02 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 ctc( int nod ,int viz[MAX]){

    int i,gasire,j,k;
    cout<<"viz="<<viz[nod]<<" "<<viz[nod-1];
    viz[nod]=1;

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

           comp_conexe[nr_comp_conexe].push_back(nod);

            return 1;

        }
        else
            if(viz[graf[nod][i]]==0){
                gasire=ctc(graf[nod][i],viz);
                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)

                    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,j,k,ok,ok1,nr_comp_conexe1,p;

    nr_comp_conexe1=nr_comp_conexe;

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

    }
    return nr_comp_conexe1;
}

int main(){

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

    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;
    }
    cout<<endl;

        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;

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

    }

    nr_comp_conexe=reuniune();

    afisare();

    return 0;
}