Pagini recente » Cod sursa (job #378877) | Arhiva Educationala | Arhiva Educationala | Arhiva Educationala | Cod sursa (job #230423)
Cod sursa(job #230423)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
const char iname[] = "ctc.in";
const char oname[] = "ctc.out";
#define MAXN 100005
vector <int> Go[MAXN], Gi[MAXN], G[MAXN];
void read_in(vector <int>* Go, vector <int>* Gi, int& n, const char iname[])
{
ifstream in(iname);
int cnt_edges, x, y;
in >> n;
for (in >> cnt_edges; cnt_edges > 0; -- cnt_edges) {
in >> x >> y;
x --, y --;
Go[x].push_back(y);
Gi[y].push_back(x);
}
in.close();
}
vector <int> used;
void DFP(const int n, vector <int>* G, vector <int>& adj) // Marcheaza cu +
{
vector <int>::iterator it;
used[n] = 1;
for (it = G[n].begin(); it != G[n].end(); ++ it)
if (used[*it] == 0)
DFP(*it, G, adj);
adj.push_back(n);
}
void DFM(const int n, vector <int>* G, vector <int>& adj) // Marcheaza cu -
{
vector <int>::iterator it;
used[n] = 2;
for (it = G[n].begin(); it != G[n].end(); ++ it)
if (used[*it] == 1)
DFM(*it, G, adj);
adj.push_back(n);
}
void print_out(const vector <int>* G, const int n, const char oname[])
{
ofstream out(oname);
vector <int>::const_iterator it;
out << n <<'\n';
for (int i = 0; i < n; ++ i) {
for (it = G[i].begin(); it != G[i].end(); ++ it)
out << *it + 1 << " ";
out << '\n';
}
out.close();
}
int main(void)
{
int n;
vector <int> adj, nodes;
vector <int>::iterator it;
read_in(Go, Gi, n, iname);
for (int i = 0; i < n; ++ i) nodes.push_back(i);
random_shuffle(nodes.begin(), nodes.end());
used.resize(n);
used.assign(used.size(), 0);
int count = 0;
for (int i = 0; i < n; ++ i) if (used[ nodes[i] ] == 0) {
adj.clear();
DFP(nodes[i], Go, adj);
DFM(nodes[i], Gi, G[count]), count ++;
for (it = adj.begin(); it != adj.end(); ++ it)
if (used[*it] == 1)
used[*it] = 0;
}
print_out(G, count, oname);
return 0;
}