Pagini recente » Cod sursa (job #2761279) | Cod sursa (job #1305757) | Cod sursa (job #1592289) | Cod sursa (job #1414764) | Cod sursa (job #1351085)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#define MAXN 100050
using namespace std;
int n, m, marked[MAXN], nm[MAXN], nq;
vector<int> v[MAXN];
vector<int> trV[MAXN];
vector<int> compo[200];
void citire()
{
int x, y;
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++)
{
scanf("%d %d", &x, &y);
v[x].push_back(y);
trV[y].push_back(x);
}
}
void dfs(int x)
{
if (nm[x] || marked[x]) return;
marked[x] = 1;
for (int i = 0; i < v[x].size(); i++)
dfs(v[x][i]);
}
void rdfs(int x)
{
if (nm[x] || marked[x] >= 5) return;
marked[x] += 5;
if (marked[x] == 6)
{
compo[nq].push_back(x);
nm[x] = 1;
}
for (int i = 0; i < trV[x].size(); i++)
rdfs(trV[x][i]);
}
void solve()
{
for (int i = 1; i <= n; i++)
if (!nm[i])
{
memset(marked, 0, sizeof(marked));
dfs(i);
rdfs(i);
nq++;
}
}
void afisare()
{
printf("%d\n", nq);
for (int i = 0; i < nq; i++)
{
for (int j = 0; j < compo[i].size(); j++)
printf("%d ", compo[i][j]);
printf("\n");
}
}
int main()
{
freopen("ctc.in", "r", stdin);
freopen("ctc.out", "w", stdout);
citire();
solve();
afisare();
return 0;
}