Pagini recente » Cod sursa (job #782441) | Cod sursa (job #1769103) | Cod sursa (job #195570) | Cod sursa (job #3288155) | Cod sursa (job #1695682)
#include <fstream>
#include <vector>
#define NMAX 100005
using namespace std;
ifstream cin("ctc.in");
ofstream cout("ctc.out");
vector<int> a[NMAX],b[NMAX];
int n,m,viz1[NMAX],viz2[NMAX],marcate[NMAX],nrc;
void citire(){
int i;
cin>>n>>m;
int x,y;
for(i=1;i<=m;i++){
cin>>x>>y;
a[x].push_back(y);
b[y].push_back(x);
}
}
void DFSP(int x){
if(viz1[x]==0){
viz1[x]=1;
vector<int>::iterator it;
for(it=a[x].begin();it!=a[x].end();++it)
DFSP(*it);
}
}
void DFSM(int x){
if(viz2[x]==0){
viz2[x]=1;
//cout<<x<<' ';
vector<int>::iterator it;
for(it=b[x].begin();it!=b[x].end();++it)
DFSM(*it);
}
}
int main(){
citire();
int i,j;
for(i=1;i<=n;i++){
if(marcate[i]==0){
for(j=1;j<=n;j++)
viz1[j]=viz2[j]=0;
DFSP(i);
DFSM(i);
++nrc;
for(j=1;j<=n;j++)
if(viz1[j]==1&&viz2[j]==1)
marcate[j]=nrc;
}
}
cout<<nrc<<'\n';
for(i=1;i<=nrc;i++){
for(j=1;j<=n;j++)
if(marcate[j]==i)
cout<<j<<' ';
cout<<'\n';
}
return 0;
}