Mai intai trebuie sa te autentifici.

Cod sursa(job #2797557)

Utilizator andreea.ioanaSora Andreea-Ioana andreea.ioana Data 10 noiembrie 2021 09:12:38
Problema Componente tare conexe Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.22 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <stack>
using namespace std;

class Graf
{
   private:
       int nrN, nrM; ///Numar noduri, numar muchii
       vector <vector<int>> listaAd; ///lista de adiacenta graf
   public:
       Graf(int, int, vector <vector<int>> &);
       Graf(const Graf &graf);
       ~Graf();
       void afisare(ostream&);
       friend ostream& operator<<(ostream& out, Graf &g); ///supraincarcare operator <<
       void ctc(vector <vector<int>>, ostream &);
       void dfs1(int, vector <int> &, stack <int>&);
       void dfs2(int, vector <int> &, vector <vector<int>>, vector <vector<int>> &, int);
};

Graf :: Graf(int nrNoduri, int nrMuchii, vector <vector<int>> &lista)
{
     nrN = nrNoduri;
     nrM = nrMuchii;
     listaAd = lista;
}

Graf :: Graf(const Graf & graf)
{
     nrN = graf.nrN;
     nrM = graf.nrM;
     listaAd = graf.listaAd;
}

Graf :: ~Graf()
{
    nrN = 0;
    nrM = 0;
    listaAd.clear();
}

void Graf :: afisare(ostream &out)
{
    out << "Numar de noduri: " << nrN << "\n";
    out << "Numar de muchii: " << nrM << "\n";
    for (int i = 0; i < nrN; i++)
        for (int j = 0; j < listaAd[i].size(); j++)
           {
               out << "Muchia "  << i << " " << listaAd[i][j];
               out << "\n";
           }
}

ostream& operator<<(ostream& out, Graf &g)
{
    g.afisare(out);
    return out;
}

void Graf :: dfs1(int nod, vector <int> &vizitat, stack <int> &stiva)
{
    vizitat[nod] = 1;
    for (int i = 0; i < listaAd[nod].size(); i++)
        if (vizitat[listaAd[nod][i]] == 0)
            dfs1(listaAd[nod][i], vizitat, stiva);
   stiva.push(nod);
}

void Graf :: dfs2(int nod, vector <int> &vizitatTr, vector <vector<int>> listaTr, vector <vector<int>> &rez, int nr)
{
    //cout << nod << " ";
    rez[nr].push_back(nod);
    vizitatTr[nod] = 1;
    for (int i = 0; i < listaTr[nod].size(); i++)
        if (vizitatTr[listaTr[nod][i]] == 0)
            dfs2(listaTr[nod][i], vizitatTr, listaTr, rez, nr);
}

void Graf :: ctc(vector <vector<int>> listaTr, ostream &out)
{
    int nr = 0;
    vector <int> vizitat(nrN + 1, 0);
    vector <int> vizitatTr(nrN + 1, 0);
    stack <int> stiva;
    vector <vector<int>> rez(nrN + 1);
    for (int i = 1; i <= nrN; i++)
        if (vizitat[i] == 0)
            dfs1(i, vizitat, stiva);
    while (stiva.empty() == 0)
    {
       int v = stiva.top();
       stiva.pop();
       if (vizitatTr[v] == 0)
       {
          nr++;
          dfs2(v, vizitatTr, listaTr, rez, nr);
       }
    }
    out << nr;
    for (int i = 0; i < rez.size(); i++)
    {
       for (int j = 0; j < rez[i].size(); j++)
           out << rez[i][j] << " ";
       out << "\n";
    }
}

int main()
{
    ifstream fin("ctc.in");
    ofstream fout("ctc.out");
    int n, m, st, dr;
    fin >> n >> m;
    vector <vector<int>> listaAd (n + 1);
    vector <vector<int>> listaTr (n + 1);
    for (int i = 1; i <= m; i++)
    {
        fin >> st >> dr;
        listaAd[st].push_back(dr);
        listaTr[dr].push_back(st);
    }
    Graf g(n, m, listaAd);
    g.ctc(listaTr, fout);
    fin.close();
    fout.close();
    return 0;
}