Cod sursa(job #2789247)

Utilizator andreea.ioanaSora Andreea-Ioana andreea.ioana Data 27 octombrie 2021 11:22:45
Problema Parcurgere DFS - componente conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.16 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

class Graf
{
   private:
       int nrN, nrM; ///Numar noduri, numar muchii
       vector <int> listaAd[100002]; ///lista de adiacenta graf
   public:
       void citire(istream&);
       void afisare(ostream&);
       friend istream& operator>>(istream& in, Graf &g); ///supraincarcare operator >>
       friend ostream& operator<<(ostream& out, Graf &g); ///supraincarcare operator <<
       void DFS(ostream &);
       void DoDfs(int, vector <int> &);
};

void Graf :: citire(istream &in) ///citim graful neorientat
{
    in >> nrN;
    in >> nrM;
    int st, dr;
    for (int i = 1; i <= nrM; i++)
    {
        in >> st >> dr;
        listaAd[st].push_back(dr);
        listaAd[dr].push_back(st);
    }
}

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";
           }
}

istream& operator>>(istream& in, Graf &g)
{
    g.citire(in);
    return in;
}

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

void Graf :: DoDfs(int nod, vector <int> &viz)
{
    viz[nod] = 1; ///vizitam nodul curent
    for (int i = 0; i < listaAd[nod].size(); i++) ///parcurgem vecinii nodului curent
    {
        int nod_curent = listaAd[nod][i];
        if (viz[nod_curent] == 0) ///daca vecinul este nevizitat
            DoDfs(nod_curent, viz);
    }
}

void Graf :: DFS(ostream &out)
{
    vector <int> viz(nrN + 1, 0); ///initializam vectorul viz
    int nrCC = 0; ///numar componente conexe
    for (int i = 1; i <= nrN; i++)
    {
        if (viz[i] == 0) ///daca nodul este nevizitat
        {
            DoDfs(i, viz);
            nrCC ++;
        }
    }
    out << nrCC;
}

int main()
{
    ifstream fin("dfs.in");
    ofstream fout("dfs.out");
    Graf g;
    fin >> g;
    g.DFS(fout);
    fin.close();
    fout.close();
    return 0;
}