Cod sursa(job #2793794)

Utilizator cosmin1812Nedelcu Adrian Cosmin cosmin1812 Data 4 noiembrie 2021 01:05:59
Problema Parcurgere DFS - componente conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<queue>
#include<stack>
using namespace std;


class Graf
{

private:

	int nr_noduri;
	int nr_muchii;
	vector<int>init;
	vector<int>fin;
	

public:


	Graf(){

		ifstream f("bfs.in");
		int x, y;
		f >> nr_noduri;
		f >> nr_muchii;

		while (f >> x >> y) {

			init.push_back(x);
			fin.push_back(y);
		}


		f.close();
	}


	int get_nr_noduri() { return nr_noduri; }
	void set_nr_noduri(int n) { nr_noduri = n; }

	int get_nr_muchii() { return nr_muchii; }
	void set_nr_muchii(int m) { nr_muchii = m; }


	void dfs(int start, vector<int>& vizit) {

		bool ok;
		vector<vector<int>> lista;
		lista.resize(get_nr_noduri() + 1);

		for (int i = 0; i < nr_muchii ; i++) {

			lista[init[i]].push_back(fin[i]);
			lista[fin[i]].push_back(init[i]);
		}

		stack<int>st;
		int x;


		st.push(start);
		vizit[start] = 1;

		while (!st.empty()) {

			ok = false;
			x = st.top();
			
			if (lista[x].size() == 0) { st.pop(); }

			for (int i = 0; i < lista[x].size() && ok == false; i++) {


				if (vizit[lista[x][i]] == 0) {

					st.push(lista[x][i]);
					vizit[lista[x][i]] = 1;
					ok = true;
				}
				else if (i == lista[x].size() - 1) { st.pop(); }
			}
		}
	}


	bool check_vizit(vector<int>vizit) {

		for (int i = 1; i <= nr_noduri; i++)
			if (vizit[i] == 0)
				return false;

		return true;
	}



	void comp_conexe() {

		vector<int> vizit;
		for (int i = 0; i <= nr_noduri; i++) { vizit.push_back(0); }

		int count = 0;
		
		for (int i = 1; i < nr_noduri && check_vizit(vizit) == false; i++) {

			if (vizit[i] == 0) {

				dfs(i, vizit);
				count++;
			}
			
		}

		ofstream g("bfs.out");
		g << count;
		g.close();
	}



}




int main() {

	Graf* g = new Graf;

	g->comp_conexe();


	return 0;
}