Pagini recente » Cod sursa (job #129941) | Cod sursa (job #2341746) | Cod sursa (job #319817) | Cod sursa (job #11713) | Cod sursa (job #2122991)
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=100007;
ifstream in("ctc.in");
ofstream out("ctc.out");
vector<int>L[N],Lt[N],ctc[N];
int n,m,st[N],nrc,top;
bool viz[N];
void citire(){
in>>n>>m;
int i,x,y;
for(i=1;i<=m;i++){
in>>x>>y;
L[x].pb(y);
Lt[y].pb(x);
}}
void dfs1(int x){
int i,z;
viz[x]=1;
st[++top]=x;
for(i=0;i<L[x].size();i++)
{z=L[x][i];
if(!viz[z])dfs1(z);
}
}
void dfs2(int x){
int i,z;
viz[x]=1;
for(i=0;i<Lt[x].size();i++){
z=Lt[x][i];
if(!viz[z])dfs2(z);}
ctc[nrc].pb(x);
}
void afisare(){
int i,j;
out<<nrc<<"\n";
for(i=1;i<=nrc;i++)
{for(j=0;j<ctc[i].size();j++)
out<<ctc[i][j]<<" ";
out<<"\n";
}}
void rez(){
int i,y;
for(i=1;i<=n;i++)
if(!viz[i])dfs1(i);
for(i=1;i<=n;i++)viz[i]=0;
while(top)
{y=st[top--];
if(!viz[y]){
++nrc;
dfs2(y);}
}}
int main(){
citire();
rez();
afisare();
in.close();
out.close();
return 0;}