Pagini recente » Cod sursa (job #2588866) | Cod sursa (job #825256) | Cod sursa (job #627562) | Cod sursa (job #1896272) | Cod sursa (job #3272099)
//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;
}