Pagini recente » Cod sursa (job #3248949) | Cod sursa (job #1024768) | Cod sursa (job #1033719) | Cod sursa (job #3172876) | Cod sursa (job #503246)
Cod sursa(job #503246)
#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();
}