Pagini recente » Cod sursa (job #728028) | Cod sursa (job #2718094) | Cod sursa (job #174180) | Cod sursa (job #70446) | Cod sursa (job #503322)
Cod sursa(job #503322)
// 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;
ifstream in("ctc.in");
ofstream out("ctc.out");
void read();
void topologicalSort(vector< list<int> > theGraph);
void depthFirst(int toVisit);
void write();
void depthFirstTransposeGraph(int toVisit);
int main() {
read();
topologicalSort(graph);
write();
return (0);
}
void read() {
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);
}
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 depthFirstTransposeGraph(int toVisit) {
visit.at(toVisit) = true;
out << toVisit << " ";
for(list<int>::iterator it=transposeGraph.at(toVisit).begin();it!=transposeGraph.at(toVisit).end();it++)
if(!visit.at(*it))
depthFirstTransposeGraph(*it);
}
void write() {
visit.assign(nodes+1,false);
for(int i=1;i<=100000;i++)
out << 1;
out << endl;
for(list<int>::iterator it=order.begin();it!=order.end();it++)
if(!visit.at(*it)) {
depthFirstTransposeGraph(*it);
stronglyConnectedComponents++;
out << endl;
}
out.seekp(0);
out << stronglyConnectedComponents;
int size = stronglyConnectedComponents % 10; // numarul de cifre
size = 100000 - size;
for(int i=1;i<=size;i++)
out << " ";
out.close();
}