Cod sursa(job #2417760)

Utilizator frodobiosif aug frodob Data 1 mai 2019 11:10:49
Problema Parcurgere DFS - componente conexe Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
/*
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();
}