Pagini recente » Cod sursa (job #1331016) | Cod sursa (job #583555) | Cod sursa (job #2709924) | Cod sursa (job #2000965) | Cod sursa (job #289066)
Cod sursa(job #289066)
#include <cstdio>
#include <vector>
#define dim 100100
using namespace std;
int n, m;
vector<int> gn[dim], gt[dim], used, where, discovered, g[dim];
void dfp(int x, vector<int> *g)
{
used[x]=1;
for (vector<int>::iterator it=g[x].begin(); it!=g[x].end(); it++)
if (!used[*it])
dfp(*it, g);
discovered.push_back(x);
}
void dfm(int x, vector<int> *g, int count)
{
where[x]=count;
for (vector<int>::iterator it=g[x].begin(); it!=g[x].end(); it++)
if (where[*it]==-1) dfm(*it, g, count);
}
int main()
{
int i, count=0, x, y;
freopen("ctc.in", "r", stdin);
freopen("ctc.out", "w", stdout);
scanf("%d %d\n", &n, &m);
for (i=1; i<=m; i++)
{
scanf("%d %d\n", &x, &y);
x--, y--;
gn[x].push_back(y);
gt[y].push_back(x);
}
used.resize(n);
used.assign(used.size(), 0);
for (i=0; i<n; i++)
if (!used[i])
dfp(i, gn);
where.resize(n);
where.assign(where.size(), -1);
for (; discovered.size(); discovered.pop_back())
if (where[discovered.back()]==-1)
{
dfm(discovered.back(), gt, count);
count++;
}
for (i=0; i<n; i++) g[where[i]].push_back(i);
printf("%d\n", count);
for (i=0; i<count; i++)
{
for (vector<int>::iterator it=g[i].begin(); it!=g[i].end(); it++)
printf("%d ", *it+1);
printf("\n");
}
return 0;
}