Pagini recente » Cod sursa (job #2802327) | Cod sursa (job #2362360) | Cod sursa (job #2565836) | Cod sursa (job #526153) | Cod sursa (job #1262876)
#include<cstdio>
#define MAX_M 200000
#define MAX_N 100000
using namespace std;
int lst[MAX_N+1];
int urm[MAX_M+1];
int v[MAX_M+1];
int m1;
int lst_inv[MAX_N+1];
int urm_inv[MAX_M+1];
int v_inv[MAX_M+1];
int m2;
int st[MAX_N+1];
int k;
int viz[MAX_N+1];
int comp[MAX_N+1];
int start[MAX_N+1];
int cnt,p;
void adauga1(int tip,int x){
v[m1]=x;
urm[m1]=lst[tip];
lst[tip]=m1;
m1++;
}
void adauga2(int tip,int x){
v_inv[m2]=x;
urm_inv[m2]=lst_inv[tip];
lst_inv[tip]=m2;
m2++;
}
void dfs1(int x){
viz[x]=1;
int i=lst[x];
while(i!=0){
if (viz[v[i]]==0) dfs1(v[i]);
i=urm[i];
}
st[k]=x;
k++;
}
void dfs2(int x){
viz[x]=1;
comp[p]=x;
p++;
int i=lst_inv[x];
while(i!=0){
if (viz[v_inv[i]]==0) dfs2(v_inv[i]);
i=urm_inv[i];
}
}
int main(){
freopen ("ctc.in","r",stdin);
freopen ("ctc.out","w",stdout);
int n,m,i,x,y;
scanf ("%d%d",&n,&m);
m1=1;
m2=1;
for(i=1;i<=m;i++){
scanf ("%d%d",&x,&y);
adauga1(x,y);
adauga2(y,x);
}
k=1;
for(i=1;i<=n;i++)
if (viz[i]==0) dfs1(i);
for(i=1;i<=n;i++)
viz[i]=0;
cnt=0;
p=1;
for(k--;k>0;k--)
if (viz[st[k]]==0){
cnt++;
start[cnt]=p;
dfs2(st[k]);
}
printf ("%d\n",cnt);
k=2;
for(i=1;i<=n;i++){
if (start[k]==i){
k++;
printf ("\n");
}
printf ("%d ",comp[i]);
}
return 0;
}