Cod sursa(job #503317)

Utilizator feelshiftFeelshift feelshift Data 22 noiembrie 2010 15:28:29
Problema Componente tare conexe Scor 12
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
// http://infoarena.ro/problema/ctc
#include <fstream>
#include <vector>
#include <list>
using namespace std;

int nodes,edges,stronglyConnectedComponents;
vector< list<int> > graph,transposeGraph;
vector<bool> visit;
list<int> order;

ofstream out("ctc.out");

void read();
void topologicalSort(vector< list<int> > theGraph);
	void depthFirst(int toVisit,vector< list<int> > theGraph);
void write();
	void depthFirstTransposeGraph(int toVisit,vector< list<int> > theGraph);

int main() {
	read();
	topologicalSort(graph);
	write();

	return (0);
}

void read() {
	ifstream in("ctc.in");
	int from,to;

	in >> nodes >> edges;
	graph.resize(nodes+1);
	transposeGraph.resize(nodes+1);
	visit.resize(nodes+1);

	for(int i=1;i<=edges;i++) {
		in >> from >> to;

		graph.at(from).push_back(to);
		transposeGraph.at(to).push_back(from);
	}

	in.close();
}

void topologicalSort(vector< list<int> > theGraph) {
	for(int i=1;i<=nodes;i++)
		if(!visit.at(i))
			depthFirst(i,theGraph);
}

void depthFirst(int toVisit,vector< list<int> > theGraph) {
	visit.at(toVisit) = true;

	for(list<int>::iterator it=theGraph.at(toVisit).begin();it!=theGraph.at(toVisit).end();it++)
		if(!visit.at(*it))
			depthFirst(*it,theGraph);

	order.push_front(toVisit);
}

void depthFirstTransposeGraph(int toVisit,vector< list<int> > theGraph) {
	visit.at(toVisit) = true;

	//out << toVisit << " ";

	for(list<int>::iterator it=theGraph.at(toVisit).begin();it!=theGraph.at(toVisit).end();it++)
		if(!visit.at(*it))
			depthFirstTransposeGraph(*it,theGraph);
}

void write() {
	visit.assign(nodes+1,false);

	for(list<int>::iterator it=order.begin();it!=order.end();it++)
		if(!visit.at(*it)) {
			depthFirstTransposeGraph(*it,transposeGraph);
			stronglyConnectedComponents++;
			//out << endl;
		}

	out << stronglyConnectedComponents;

	out.close();
}