Cod sursa(job #1458220)

Utilizator ramhackNastase Ramon ramhack Data 7 iulie 2015 10:06:25
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.44 kb

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <stack>
#define NIL -1
using namespace std;

class Graph {

private:
	vector<int> *adjList;
	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];
		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 CTC_Tarjan() {

		bool *stackMember = new bool[this->nr_noduri + 2];
		int *low = new int[this->nr_noduri + 2]; // lowest ancestor time
		int *disc = new int[this->nr_noduri + 2]; //discovery time
		stack<int> S;


		for(int i = 1; i <= this->nr_noduri; ++i) {
			stackMember[i] = false;
			low[i] = NIL;
			disc[i] = NIL;
		}

		for(int node = 1; node <= this->nr_noduri; ++node) {

			for(vector<int>::iterator it = adjList[node].begin(); it != adjList[node].end(); ++it) {
				
				if(disc[*it] == NIL) 		//node is not visited <=> !visited[i]
					CTC_Tarjan_Util(*it,low,disc,S,stackMember);
			}
		}
	}

	void CTC_Tarjan_Util(int node, int *low, int *disc,stack<int> S, bool *stackMember) {

		int time = 0;
		disc[node] = low[node] = ++time;
		S.push(node);
		stackMember[node] = true;

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

			if(disc[*it] == NIL) {
				CTC_Tarjan_Util(*it, low, disc, S, stackMember);
				low[node] = min(low[node], low[*it]);
			}

			else if(stackMember[*it] == true) {
				low[node] = min(low[node], disc[*it]);
			}
			
		}

		int w = 0;
		//head node found, pop the stack and print CTC
		if(low[node] == disc[node]) {

			while(S.top() != node) {

				w = S.top();
				cout << w << ' ';
				stackMember[w] = false;
				S.pop();
			}

			w = S.top();
			cout << w << ' ';
			stackMember[w] = false;
			S.pop();
		}
	}


	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);

	Graph g(N);

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

		fscanf(f, "%d %d", &x, &y);
		g.addEdge(x,y);
	}
	g.CTC_Tarjan(); cout << endl;
	cout << g.getCTC() << endl;
	fprintf(fwr, "%d\n", g.getCTC());
	
	fclose(f);
	fclose(fwr);

	return 0;
}