Pagini recente » Cod sursa (job #1767390) | Cod sursa (job #1993174) | Cod sursa (job #631885) | Cod sursa (job #2666586) | Cod sursa (job #2417760)
/*
Se da un graf neorientat cu N noduri si M muchii.
Cerinta
Sa se determine numarul componentelor conexe ale grafului.
Date de intrare
Fisierul de intrare dfs.in contine pe prima linie numerele N si M cu semnificatia din enunt, iar pe urmatoarele M linii se gasesc cate doua numere X si Y cu semnificatia: exista muchie de la nodul X la nodul Y.
Date de iesire
In fisierul de iesire dfs.out se va afisa numarul de componente conexe ale grafului.
Restrictii
1 ≤ N ≤ 100 000
0 ≤ M ≤ minim(200 000, N*(N+1)/2)
Pentru 50% dintre teste 1 ≤ N ≤ 1 000
*/
#include <iostream>
#include <fstream>
using namespace std;
int main() {
fstream fin("dfs.in", ios::in);
fstream fout("dfs.out", ios::out);
int N, M;
int x, y;
// citesc N,M
fin >> N >> M;
// matrice adiacenta
char** matrice = new char*[N];
for (int i = 0; i < N; i++)
matrice[i] = new char[N];
// initializare matrice
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
matrice[i][j] = 0;
// citire matrice
while (fin >> x >> y) {
matrice[x-1][y-1] = 1;
matrice[y-1][x-1] = 1;
}
// declarare vizitare
char* vizitate = new char[N];
for (int i = 0; i < N; i++)
vizitate[i] = 0;
// parcurgere dfs
int conexe = 0;
for (int i = 0; i < N; i++) {
if (0 == vizitate[i]) {
conexe++;
vizitate[i] = 1;
}
for (int j = i + 1; j < N; j++)
if (matrice[i][j])
vizitate[j] = 1;
}
// afisare
fout << conexe;
// delete
for (int i = 0; i < N; i++)
delete matrice[i];
delete[] matrice;
delete[] vizitate;
// close
fin.close();
fout.close();
}