Cod sursa(job #3272099)

Utilizator AndreeaHzmAndreea Huzum AndreeaHzm Data 28 ianuarie 2025 13:22:01
Problema Parcurgere DFS - componente conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.54 kb
//Complexitate: O(n + m) - numărul de noduri + numărul de muchii

#include <fstream>
#include <vector>

#define maxi 100001

using namespace std;

ifstream fin("dfs.in");
ofstream fout("dfs.out");

class Graf {
    int nrNoduri, nrMuchii;  // Numarul de noduri si muchii
    int x, y;               // Extremitati pentru o muchie
    int vizitat[maxi] = {0}; // Vector pentru marcarea nodurilor vizitate
    vector<int> *adiacenta; // Lista de adiacenta pentru graf

public:
    Graf();
    ~Graf();

    void citireDFS();  // Citire graf neorientat
    void DFS(int nodPlecare);  // Parcurgere in adancime (DFS)
    void nrComponenteConexe(); // Determinarea numarului de componente conexe
};

Graf::Graf() {
    nrNoduri = nrMuchii = x = y = 0;
    adiacenta = new vector<int>[maxi]; // Alocare pentru lista de adiacenta
}

Graf::~Graf() {
    delete[] adiacenta; // Eliberare memorie pentru lista de adiacenta
}

// Functie pentru citirea grafului neorientat
void Graf::citireDFS() {
    fin >> nrNoduri >> nrMuchii; // Citim numarul de noduri si muchii
    for (int i = 1; i <= nrMuchii; i++) {
        fin >> x >> y;               // Citim fiecare muchie (x, y)
        adiacenta[x].push_back(y);   // Adaugam nodul y ca vecin al nodului x
        adiacenta[y].push_back(x);   // Adaugam nodul x ca vecin al nodului y (graful este neorientat)
    }
}

// Functie recursiva pentru parcurgerea in adancime (DFS)
void Graf::DFS(int nodPlecare) {
    vizitat[nodPlecare] = 1; // Marcarea nodului curent ca vizitat
    for (auto i: adiacenta[nodPlecare]) { // Parcurgem toti vecinii nodului curent
        if (!vizitat[i]) { // Daca vecinul nu a fost vizitat
            DFS(i); // Apel recursiv pentru vecinul respectiv
        }
    }
}

// Functie pentru determinarea numarului de componente conexe
void Graf::nrComponenteConexe() {
    int nr = 0; // Initializam numarul de componente conexe cu 0
    for (int i = 1; i <= nrNoduri; i++) { // Parcurgem toate nodurile
        if (vizitat[i] == 0) { // Daca nodul nu a fost vizitat
            nr++; // Crestem numarul de componente conexe
            DFS(i); // Facem o parcurgere DFS pornind din acest nod
        }
    }
    fout << nr; // Afisam numarul de componente conexe
}

int main() {
    Graf g1; // Cream un obiect al clasei Graf
    g1.citireDFS(); // Citim graful
    g1.nrComponenteConexe(); // Determinam si afisam numarul de componente conexe

    fin.close(); // Inchidem fisierul de intrare
    fout.close(); // Inchidem fisierul de iesire

    return 0;
}