Pagini recente » Cod sursa (job #1321935) | Cod sursa (job #1426134) | Cod sursa (job #1950086) | Cod sursa (job #271026) | Cod sursa (job #2675878)
#include <fstream>
#include <vector>
#include <algorithm>
#define MAX_N 100005
using namespace std;
ifstream in("ctc.in");
ofstream out("ctc.out");
int N, M;
vector<int> adiac[MAX_N];
vector<int> inv_adiac[MAX_N];
vector<int> parcurgere, trans;
bool vizitat[MAX_N];
void DFS(vector<int> m[], int nod)
{
int i;
vizitat[nod] = !vizitat[nod];
parcurgere.push_back(nod);
for(i = 0; i < m[nod].size(); i++)
if(vizitat[m[nod][i]] != vizitat[nod])
DFS(m, m[nod][i]);
}
void afis(vector<int> to_afis)
{
for(int e : to_afis)
out << e << ' ';
out << '\n';
}
int main()
{
int x, y, i;
vector< vector<int> > rezultat;
in >> N >> M;
for(i = 0; i < M; i++) {
in >> x >> y;
adiac[x].push_back(y);
inv_adiac[y].push_back(x);
}
for(i = 1; i <= N; i++)
if(!vizitat[i])
DFS(inv_adiac, i);
reverse(parcurgere.begin(), parcurgere.end()); trans = parcurgere;
for(i = 0; i < trans.size(); i++) {
if(vizitat[trans[i]]) {
parcurgere.clear();
DFS(adiac, trans[i]);
rezultat.push_back(parcurgere);
}
}
out << rezultat.size() << '\n';
for(auto vec : rezultat)
afis(vec);
in.close();
out.close();
return 0;
}