Pagini recente » Cod sursa (job #2101566) | Cod sursa (job #237532) | Cod sursa (job #2573530) | Cod sursa (job #289895) | Cod sursa (job #3226880)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <queue>
#define MAXN 100005
using namespace std;
vector <int> parc;
vector <int> graf[MAXN];
vector <int> ginv[MAXN];
vector <int> ans[MAXN];
int seen[MAXN];
void DFS(int node){
seen[node]=1;
for(int neigh : graf[node]){
if(seen[neigh]==0){
DFS(neigh);
}
}
parc.push_back(node);
}
void DFS2(int node,int poz){
seen[node]=1;
ans[poz].push_back(node);
for(int neigh : ginv[node]){
if(seen[neigh]==0){
DFS2(neigh,poz);
}
}
}
int main(){
int n,m,i,x,y,r;
FILE *fin,*fout;
fin=fopen("ctc.in","r");
fout=fopen("ctc.out","w");
fscanf(fin,"%d%d",&n,&m);
for(i=0;i<m;i++){
fscanf(fin,"%d%d",&x,&y);
graf[x].push_back(y);
ginv[y].push_back(x);
}
for(i=1;i<=n;i++){
if(seen[i]==0){
DFS(i);
}
}
for(i=1;i<=n;i++){
seen[i]=0;
}
r=0;
while(!parc.empty()){
int node=parc.back();
parc.pop_back();
if(seen[node]==0){
DFS2(node,r);
r++;
}
}
fprintf(fout,"%d\n",r);
for(i=0;i<r;i++){
for(int node : ans[i]){
fprintf(fout,"%d ",node);
}
fprintf(fout,"\n");
}
fclose(fin);
fclose(fout);
return 0;
}