Pagini recente » Cod sursa (job #1426864) | Cod sursa (job #1887569) | Cod sursa (job #1151341) | Cod sursa (job #961541) | Cod sursa (job #1452398)
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int Nmax = 100010;
int n , m , x , y , nr;
int v[Nmax];
bool marked[Nmax];
vector < int > g[2][Nmax] , aux;
vector < pair < int , int > > ctc;
void dfs(int node , int ind)
{
marked[node] = true;
for (int i = 0; i < g[ind][node].size(); ++i)
if (!marked[g[ind][node][i]])
dfs(g[ind][node][i] , ind);
(ind) ? ctc.push_back({nr , node}) : aux.push_back(node);
}
void sorteaza(int ind)
{
memset(marked , false , sizeof(marked));
for (int i = 1; i <= n; ++i)
if (!marked[v[i]])
{
if (ind) nr++;
dfs(v[i] , ind);
}
}
int main()
{
freopen("ctc.in","r",stdin);
freopen("ctc.out","w",stdout);
for (scanf("%d %d", &n, &m); m; --m)
{
scanf("%d %d", &x, &y);
g[0][x].push_back(y);
g[1][y].push_back(x);
}
for (int i = 1; i <= n; ++i)
v[i] = i;
sorteaza(0);
reverse(aux.begin() , aux.end());
for (int i = 1; i <= n; ++i)
v[i] = aux[i-1];
sorteaza(1);
printf("%d\n%d ", nr , ctc[0].second);
for (int i = 1; i < ctc.size(); ++i)
{
if (ctc[i].first != ctc[i-1].first) printf("\n");
printf("%d ", ctc[i].second);
}
return 0;
}