Cod sursa(job #1926021)

Utilizator Consti.001FMI Dranca Constantin Consti.001 Data 13 martie 2017 21:52:22
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 4.37 kb
#include <iostream>
#include <fstream>
#include <list>
#include <queue>
#include <stack>
using namespace std;

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

class grafuri_orientate
{
    unsigned int numar_noduri;
    list <int > *lista;
    list <int> *revlista;
    public:
    grafuri_orientate(unsigned int a=0) //Constructorul
        {
            numar_noduri=a;
            lista=new list<int> [a];
            revlista=new list <int> [a];
        };

    friend istream & operator >>( istream& i, grafuri_orientate & A);
    bool get_data_graf();
    bool parcurgere_in_latime(int nod);
    bool parcurgere_in_adancime(int nod);
    bool parcurgere(int nod,bool visited[], int noduri[], int &nr);
    bool dfs_reverse(int nod, bool *visited, list <int> *&a,int nr);
    bool componente_tare_conexe();
};

int main()
{
    grafuri_orientate A;
    f>>A;
    A.componente_tare_conexe();
    return 0;
}



std:: istream & operator >>(std:: istream & i,  grafuri_orientate & A)
{
    unsigned m;
    i>>A.numar_noduri;
    i>>m;
    A.lista=new list <int> [A.numar_noduri+1];
    A.revlista=new list <int> [A.numar_noduri+1];
    for(unsigned int l=1;l<=m;l++)
    {
        int x,y;
        i>>x>>y;
        A.lista[x].push_back(y);
        A.revlista[y].push_back(x);

    }
    return i;
}

bool grafuri_orientate:: parcurgere_in_latime( int nod)
{
    queue <int> coada;
    bool visited[numar_noduri+1];
    for(unsigned int i=0;i<=numar_noduri+1;i++) visited[i]=0;

    coada.push(nod);
    visited[nod]=1;

    while(!coada.empty())
    {
        int k=coada.front();
        g<<k<<" ";
        for(list <int>:: iterator it=lista[k].begin();it!=lista[k].end();it++)
        if(visited[*it]==0)
        {
            coada.push(*it);
            visited[*it]=1;
        }
        coada.pop();
    }
    return 1;
}
bool grafuri_orientate:: parcurgere(int nod,bool visited[],int noduri[], int &nr)
{
    visited[nod]=1;
    for(list <int> :: iterator it=lista[nod].begin();it!=lista[nod].end();++it)
    if(visited[*it]==0)
        {
            parcurgere(*it,visited,noduri,nr);
        }

    nr++;
    noduri[nr]=nod;
    return 1;
}

bool grafuri_orientate:: parcurgere_in_adancime(int nod)
{
    bool visited[numar_noduri+1];
    int noduri[numar_noduri+1],nr=0;;
    for(unsigned int i=1;i<=numar_noduri;i++) visited[i]=0;
    for(unsigned int i=1;i<=numar_noduri;++i)
    if(visited[i]==0)
     {parcurgere(i,visited,noduri,nr);
     }
     for(unsigned int i=numar_noduri;i>=1;--i)
     g<<noduri[i]<<" ";g<<"\n";
    return 1;
}


bool grafuri_orientate::get_data_graf()
{
    g<<"Graful are: "<<this->numar_noduri<<" noduri\n";
    for(unsigned int i=1;i<=this->numar_noduri;i++)
    {
        for(list <int> ::iterator it=this->lista[i].begin();it!=this->lista[i].end();it++)
        g<<*it<<" ";
        g<<"\n";
    }

    g<<"GRAFUL REVERSE:";
        for(unsigned int i=1;i<=this->numar_noduri;i++)
    {
        for(list <int> ::iterator it=this->revlista[i].begin();it!=this->revlista[i].end();it++)
        g<<*it<<" ";
        g<<"\n";
    }
    return 1;
}


bool grafuri_orientate::dfs_reverse(int nod, bool *visited, list <int> *&a,int nr)
{
    visited[nod]=0;
    for(list <int> :: iterator it=revlista[nod].begin();it!=revlista[nod].end();++it)
    if(visited[*it]==1)
    {
        dfs_reverse(*it,visited,a,nr);
    }
    a[nr].push_back(nod);
    return 1;
}

bool grafuri_orientate:: componente_tare_conexe()
{
    bool visited[numar_noduri+1];
    list <int> *solutii; solutii=new list <int> [numar_noduri+1];
    int nur=0;   //Numarul solutiilor
    for(unsigned int i=1;i<=numar_noduri;++i) visited[i]=0;
    int noduri[numar_noduri+1];
    int nr=0;


    for(unsigned int i=1;i<=numar_noduri;++i)
    if(visited[i]==0)
    parcurgere(i,visited,noduri,nr);

            for(int i=1;i<=numar_noduri;i++)
cout<<noduri[i]<<" ";

     for(unsigned int i=numar_noduri;i>=1;--i)
         if(visited[noduri[i]]==1)
         {

             cout<<"DE CE?\n";
             nur++;
            dfs_reverse(noduri[i],visited,solutii,nur);

         }

     g<<nur<<"\n";
     for(int i=1;i<=nur;++i)
     {
         for(list <int> :: iterator it=solutii[i].begin();it!=solutii[i].end();++it)
         g<<*it<<" ";
         g<<"\n";
     }
     return 1;
}