Cod sursa(job #1458200)

Utilizator ramhackNastase Ramon ramhack Data 7 iulie 2015 09:18:28
Problema Parcurgere DFS - componente conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.84 kb
#include <iostream>
#include <vector>
#include <stack>
#include <cstdio>

using namespace std;

class Graph {

private:
	vector<int> *adjList;
	int nr_noduri;
	int nr_conexe;
	bool *connectedComp;

public:
	Graph(int nr_noduri) {

		this->nr_noduri = nr_noduri;
		adjList = new vector<int>[nr_noduri + 2];
		nr_conexe = 0;
		connectedComp = new bool[this->nr_noduri + 2];
	}
	~Graph() {
		delete[] adjList;
	}

	void addEdge(int u, int v) {

		adjList[u].push_back(v);
	}
/*
	void DFS_iterative(int root_node) {

		bool *visited = new bool[MAX];
		
		for(int i = 0; i < nr_noduri; i++) {
			visited[i] = false;
		}
		visited[root_node] = true;
		stack<int> S;
		S.push(root_node);
		int node;
		vector<int>::iterator it;

		cout << "DFS: ";
		while(!S.empty()) {
		    
			node = S.top();
			S.pop();
			nr_conexe++;
			cout << node << " ";

			if(visited[node] == false) {
				visited[node] = true;
			}
			for(it = adjList[node].begin(); it != adjList[node].end(); ++it) {
				S.push(*it);
			}	
		}
		cout << endl;
		
	}

	void DFS_recursive(int start_node) {

		
		visited[start_node] = true;
		vector<int>::iterator it;
//		cout << "\nDFS_recursive: ";
		cout << start_node << " ";
		for(it = adjList[start_node].begin(); it != adjList[start_node].end(); ++it) {

//			cout << *it << " ";
		
			if(visited[*it] == false) {
				nr_conexe++;
				//visited[*it] = true;
				DFS_recursive(*it);
			}
		}
	}*/

	void DFShelper(int node, bool *visited) {

		visited[node] = true;
		cout << node << " ";

		for(vector<int>::iterator it = adjList[node].begin(); it != adjList[node].end(); it++) {

			if(!visited[*it]) {

				DFShelper(*it, visited);
			}
		}
	}

	void DFS() {

		bool *visited = new bool[nr_noduri + 2];

		for(int i = 1; i <= nr_noduri; i++) {
			visited[i] = false;
		}

		for(int i = 1; i <= nr_noduri; i++) {

			if(!visited[i]) {
				nr_conexe++;
				DFShelper(i, visited);
			}		
		}
		delete[] visited;
	}

/*

	bool getVisitedInfo(int node) {

		if(this->visited[node] == true) return true;
		else return false;
	}
*/
	int getNrConexe() {
		return this->nr_conexe;
	}
	
};


int main(int argc, char const *argv[])
{
	FILE *f, *fwr;

	fwr = fopen("dfs.out", "w");

	//if((f = fopen("grader_test1.in", "r")) == NULL) {
	
	if((f = fopen("dfs.in", "r")) == NULL) {
		fprintf(stderr, "Can't open file\n");
		return 0;
	}
	int N, M, x ,y;

	fscanf(f, "%d %d", &N, &M);

	//cout << N << " " << M << endl;
	Graph g(N);

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

		fscanf(f, "%d %d", &x, &y);
		//cout << x << " " << y << endl;
		g.addEdge(x,y);
		g.addEdge(y,x);
	}
	/*
	//root_node = 50;
	//g.DFS_iterative(root_node);
	int nr_conexe = 0;
	for(int i = 1; i <= N; i++) {

		if(!g.getVisitedInfo(i)) {
			nr_conexe++;
			g.DFS_recursive(i);
		}
	
	}
	*/

	g.DFS();

	printf("\nNr de componente conexe: %d\n", g.getNrConexe());
	fprintf(fwr, "%d\n", g.getNrConexe());
	fclose(f);
	fclose(fwr);

	return 0;
}