Cod sursa(job #1456538)

Utilizator ramhackNastase Ramon ramhack Data 1 iulie 2015 09:52:23
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.99 kb
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <stack>

using namespace std;

class Graph {

private:
	vector<int> *adjList;
	vector<int> *revAdjList;
	stack<int> S;
	int nr_noduri;
	int ctc;
	int t;
	vector<int> *ctcElements;
public:
	Graph(int nr_noduri) {

		this->nr_noduri = nr_noduri;
		adjList = new vector<int>[nr_noduri + 2];
		revAdjList = new vector<int>[nr_noduri + 2];
		ctcElements = new vector<int>[nr_noduri + 2];
		ctc = t = 0;
	}
	~Graph() {
		delete[] adjList;
	}

	void addEdge(int u, int v) {

		adjList[u].push_back(v);
	}

	void addEdgeRev(int u, int v) {

		revAdjList[u].push_back(v);
	}
	

	void DFS(FILE *f) {

		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]) {
				DFShelper(i, visited, this->adjList, f);
			}		
		}
		delete[] visited;
	}


	void DFShelper(int node, bool *visited, vector<int> *adjList, FILE *f) {

		visited[node] = true;

		cout << node << " ";
		// fprintf(f, "%d ", node);
		ctcElements[t].push_back(node);
		for(vector<int>::iterator it = adjList[node].begin(); it != adjList[node].end(); it++) {

			if(visited[*it] == false) {

				visited[*it] = true;
				DFShelper(*it, visited, adjList, f);

			}
		}
	}

	
	
	void DFS_Util_Stack(int node, bool *visited) {
		
		visited[node] = true;

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

			if(visited[*it] == false) {

				visited[*it] = true;
				DFS_Util_Stack(*it, visited);

			}
		}
		S.push(node);
	}


	void Kosaraju_CTC(FILE *f) {


		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) { // Does DFS and adds nodes in stack
			
			if(!visited[i]) {
				DFS_Util_Stack(i,visited);
			}
		}

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

		while(!S.empty()) {

			int node = S.top();
			S.pop();

			if(!visited[node]) {

				DFShelper(node, visited, revAdjList, f);
				//fprintf(f, "\n");
				cout << endl;
				this->t++;
				ctc++;
			}
		}

	}

	void printCTC(FILE *f) {

		for(int i = 0; i < t; ++i) {
			for(vector<int>::iterator it = ctcElements[i].begin(); it != ctcElements[i].end(); ++it) {
				fprintf(f, "%d ", *it);
			}
			fprintf(f, "\n");
		}
	}

	int getCTC() {
		return this->ctc;
	}

};


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

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

	//if((f = fopen("grader_test1.in", "r")) == NULL) {
	if((f = fopen("ctc.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.addEdgeRev(y,x);
	}
		
	g.Kosaraju_CTC(fwr);
	cout << g.getCTC() << endl;
	fprintf(fwr, "%d\n", g.getCTC());
	g.printCTC(fwr);
	
	fclose(f);
	fclose(fwr);

	return 0;
}