Cod sursa(job #503246)

Utilizator feelshiftFeelshift feelshift Data 22 noiembrie 2010 10:32:26
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <fstream>
#include <iostream>
#include <algorithm>
#include <vector>
#include <list>
using namespace std;

int nodes,edges,strongConnectedComponents;
vector< list<int> > graph;
vector< list<int> > secondGraph;
vector<bool> visit;
list<int> order;

void read();
void depthFirst(int toVisit);
void depthFirstSecond(int toVisit);
void createSecondGraph();
void write();

int main() {
	read();
	
	for(int i=1;i<=nodes;i++)
		if(!visit.at(i))
			depthFirst(i);
	//cout << "Aici se termina prima parcurgere!" << endl;

	createSecondGraph();
	visit.assign(nodes+1,false);
	
	for(list<int>::reverse_iterator it=order.rbegin();it!=order.rend();it++) {
		//cout << *it << endl;
		if(!visit.at(*it)) {
			depthFirstSecond(*it);
			//cout << endl;
			strongConnectedComponents++;
		}
		//cout << endl;
	}
	
	//cout << "Numarul componentelor tari conexe " << strongConnectedComponents;
	
	write();
	
	return (0);
}

void read() {
	ifstream in("ctc.in");
	int from,to;
	
	in >> nodes >> edges;
	graph.resize(nodes+1);
	secondGraph.resize(nodes+1);
	visit.resize(nodes+1);
	
	for(int i=1;i<=edges;i++) {
		in >> from >> to;
		
		graph.at(from).push_back(to);
	}
	
	in.close();
}

void depthFirst(int toVisit) {
	visit.at(toVisit) = true;
	
	for(list<int>::iterator it=graph.at(toVisit).begin();it!=graph.at(toVisit).end();it++)
		if(!visit.at(*it))
			depthFirst(*it);

	order.push_front(toVisit);
}

void depthFirstSecond(int toVisit) {
	visit.at(toVisit) = true;
	
	for(list<int>::iterator it=secondGraph.at(toVisit).begin();it!=secondGraph.at(toVisit).end();it++)
		if(!visit.at(*it))
			depthFirstSecond(*it);

	//cout << toVisit << " ";
}

void createSecondGraph() {
	for(int i=1;i<=nodes;i++)
		for(list<int>::iterator it=graph.at(i).begin();it!=graph.at(i).end();it++)
			secondGraph.at(*it).push_back(i);
}

void write() {
	ofstream out("ctc.out");
	
	out << strongConnectedComponents + 1 << endl;
	
	out.close();
}