Pagini recente » Cod sursa (job #417574) | Cod sursa (job #336362) | Cod sursa (job #1887534) | Cod sursa (job #667473) | Cod sursa (job #1219422)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream F("ctc.in");
ofstream G("ctc.out");
const int N = 100010;
int n,nn,m,mark[N];
vector<int> v[N],vt[N],w[N],comp[N],stack;
void dff(int x)
{
mark[x] = 1;
for (size_t i=0;i<v[x].size();++i)
{
int y = v[x][i];
if ( mark[y] == 0 )
dff(y);
}
stack.push_back(x);
}
void dfs(int x,int comp)
{
mark[x] = comp;
for (size_t i=0;i<vt[x].size();++i)
{
int y = vt[x][i];
if ( mark[y] == 0 )
dfs(y,comp);
}
}
void ctc()
{
for (int i=1;i<=n;++i)
if ( mark[i] == 0 )
dff(i);
memset(mark,0,sizeof(mark));
for (;!stack.empty();stack.pop_back())
{
int x = stack.back();
if ( mark[x] == 0 )
dfs(x,++nn);
}
for (int i=1;i<=n;++i)
comp[mark[i]].push_back(i);
G<<nn<<'\n';
for (int i=1;i<=nn;++i)
{
for (size_t j=0;j<comp[i].size();++j)
G<<comp[i][j]<<' ';
G<<'\n';
}
}
int main()
{
F>>n>>m;
for (int i=1,x,y;i<=m;++i)
{
F>>x>>y;
v[x].push_back(y);
vt[y].push_back(x);
}
ctc();
}