Pagini recente » Cod sursa (job #1310508) | Cod sursa (job #1314772) | Cod sursa (job #1737987) | Cod sursa (job #896763) | Cod sursa (job #1493399)
#include <stdio.h>
#include <bitset>
#include <vector>
#include <cstring>
#define NMAX 100005
using namespace std;
vector <int> G[NMAX], Gt[NMAX];
bitset <NMAX> viz, viz2;
int sol[NMAX], k;
void dfs(int nod){
viz[nod] = 1;
vector <int> :: iterator it;
for(it = G[nod].begin(); it != G[nod].end(); ++it)
if(!viz[*it])
dfs(*it);
sol[++k] = nod;
}
void dfs2(int nod, int caz){
viz2[nod] = 1;
if(caz == 2)
printf("%d ", nod);
vector <int> :: iterator it;
for(it = Gt[nod].begin(); it != Gt[nod].end(); ++it)
if(!viz2[*it])
dfs2(*it, caz);
}
int main(){
freopen("ctc.in", "r", stdin);
freopen("ctc.out", "w", stdout);
int N, M, x, y, nr = 0;
scanf("%d %d", &N, &M);
for(int i = 1; i <= M; ++i){
scanf("%d %d", &x, &y);
G[x].push_back(y);
Gt[y].push_back(x);
}
for(int i = 1; i <= N; ++i)
if(!viz[i])
dfs(i);
for(int i = N; i >= 1; --i)
if(!viz2[sol[i]]){
dfs2(sol[i], 1);
++nr;
}
printf("%d\n", nr);
for(int i = 1; i <= NMAX; ++i)
viz2[i] = 0;
for(int i = N; i >= 1; --i)
if(!viz2[sol[i]]){
dfs2(sol[i], 2);
++nr;
printf("\n");
}
return 0;
}