Pagini recente » Cod sursa (job #1490049) | Cod sursa (job #2113072) | Cod sursa (job #426405) | Cod sursa (job #1523162) | Cod sursa (job #420518)
Cod sursa(job #420518)
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
int n,m,cnt;
vector <int> succ[100100],pred[100100],comp[100100];
bool marc[100100],v[100100];
void dfs(int nod)
{
v[nod]=1;
for (int i=0;i<succ[nod].size();++i)
if (!v[succ[nod][i]])
dfs(succ[nod][i]);
}
void dfsinv(int nod)
{
marc[nod]=1;
for (int i=0;i<pred[nod].size();++i)
if (!marc[pred[nod][i]]&&v[pred[nod][i]])
{
comp[cnt].push_back(pred[nod][i]);
dfsinv(pred[nod][i]);
}
}
void conex()
{
for (int i=1;i<=n;++i)
if (!marc[i])
{
comp[++cnt].push_back(i);
memset(v,0,sizeof(v));
dfs(i);
dfsinv(i);
}
}
void citire()
{
scanf("%d%d",&n,&m);
int x,y;
for (int i=1;i<=m;++i)
{
scanf("%d%d",&x,&y);
succ[x].push_back(y);
pred[y].push_back(x);
}
}
void scrie()
{
printf("%d\n",cnt);
for (int i=1;comp[i].size();++i)
{
for (int j=0;j<comp[i].size();++j)
printf("%d ",comp[i][j]);
printf("\n");
}
}
int main()
{
freopen ("ctc.in","r",stdin);
freopen ("ctc.out","w",stdout);
citire();
conex();
scrie();
return 0;
}