Pagini recente » Cod sursa (job #355016) | Cod sursa (job #838658) | Cod sursa (job #2132380) | Cod sursa (job #3131519) | Cod sursa (job #1267896)
#include<cstdio>
using namespace std;
FILE *in = fopen("ctc.in","r");
FILE *out = fopen("ctc.out","w");
const int mMax = 200002;
int val1[mMax], urm1[mMax], lst1[mMax], n, m, nrv, v[mMax/2], nre, sol;
struct element{
int val;
int nr;
}comp[mMax/2];
int val2[mMax], urm2[mMax], lst2[mMax];
bool viz[mMax/2];
void dfs(int nod){
viz[nod]=1;
int vec = val1[lst1[nod]], pozu = lst1[nod];
while(pozu!=-1){
if(!viz[vec])
dfs(vec);
vec=val1[urm1[pozu]];
pozu=urm1[pozu];
}
v[nrv++]=nod;
}
void dfs2(int nod){
viz[nod]=1;
comp[nre].val=nod;
comp[nre++].nr=sol;
int vec = val2[lst2[nod]], pozu = lst2[nod];
while(pozu!=-1){
if(!viz[vec])
dfs2(vec);
vec=val2[urm2[pozu]];
pozu=urm2[pozu];
}
}
int main(){
fscanf(in,"%d%d",&n,&m);
int x,y;
for(int i = 0 ; i <= n ; i++) lst1[i] = lst2[i] = -1;
for(int i = 0 ; i < m ; i++){
fscanf(in,"%d%d",&x,&y);
val1[i]=y;
urm1[i]=lst1[x];
lst1[x]=i;
}
int nod = 1;
while(nrv < n){
dfs(nod);
nod++;
}
int vec, pozu, cnt = 0;
for(int i = 1 ; i <= n ; i++){
vec = val1[lst1[i]], pozu = lst1[i];
while(pozu!=-1){
val2[cnt]=i;
urm2[cnt]=lst2[vec];
lst2[vec]=cnt;
//fprintf(out,"%d %d\n",vec,i);
cnt++;
vec=val1[urm1[pozu]];
pozu=urm1[pozu];
}
}
for(int i = 0 ; i <= n ; i++) viz[i]=0;
nod = nrv-1;
sol = 0;
while(nod > 0){
if(!viz[v[nod]]){
sol++;
dfs2(v[nod]);
}
nod--;
}
fprintf(out,"%d\n",sol);
nod = 0;
for(int i = 1 ; i <= sol ; i++){
while(comp[nod].nr==i){
fprintf(out,"%d ", comp[nod].val);
nod++;
}
fprintf(out,"\n");
}
return 0;
}