Pagini recente » Cod sursa (job #368593) | Cod sursa (job #366133) | Cod sursa (job #580011) | Cod sursa (job #3218396) | Cod sursa (job #1262488)
#include<algorithm>
#include<cstdio>
#define MAX_N 100000
#define MAX_M 200000
using namespace std;
struct mazi{int n1,n2;};
mazi v[MAX_M+1];
int st[MAX_N];
bool viz[MAX_N+1];
int lst[MAX_N+1];
int k;
int start[MAX_N+1];
int rez[MAX_N];
int poz;
bool meow1(mazi a,mazi b){
if (a.n1<b.n1) return true;
return false;
}
bool meow2(mazi a,mazi b){
if (a.n2<b.n2) return true;
return false;
}
void dfs(int p){
int i;
viz[p]=1;
for(i=lst[p];v[i].n1==p;i++)
if (viz[v[i].n2]==0) dfs(v[i].n2);
st[k]=p;
k++;
}
void dfs_inv(int p){
int i;
viz[p]=1;
rez[poz]=p;
poz++;
for(i=lst[p];v[i].n2==p;i++)
if (viz[v[i].n1]==0) dfs_inv(v[i].n1);
}
int main(){
freopen ("ctc.in","r",stdin);
freopen ("ctc.out","w",stdout);
int n,m,i,cnt;
scanf ("%d%d",&n,&m);
for(i=1;i<=m;i++)
scanf ("%d%d",&v[i].n1,&v[i].n2);
sort(v+1,v+m+1,meow1);
for(i=1;i<=m;i++)
if (v[i].n1!=v[i-1].n1) lst[v[i].n1]=i;
k=1;
for(i=1;i<=n;i++)
if (viz[i]==0) dfs(i);
for(i=1;i<=n;i++)
viz[i]=0;
sort(v+1,v+m+1,meow2);
for(i=1;i<=m;i++)
if (v[i].n2!=v[i-1].n2) lst[v[i].n2]=i;
cnt=0;
poz=1;
for(i=k-1;i>0;i--)
if (viz[st[i]]==0){
cnt++;
start[cnt]=poz;
dfs_inv(st[i]);
}
printf ("%d\n",cnt);
cnt=2;
for(i=1;i<=n;i++){
if (i==start[cnt]){
printf ("\n");
cnt++;
}
printf ("%d ",rez[i]);
}
return 0;
}