Pagini recente » Cod sursa (job #917449) | Cod sursa (job #1499192) | Atasamentele paginii Profil Cosmotel | Monitorul de evaluare | Cod sursa (job #2237535)
#include <fstream>
#include <vector>
std::ifstream cin("ctc.in");
std::ofstream cout("ctc.out");
#define maxn 200020
#define inf 50000
using namespace std;
vector <int> Gi[maxn],Go[maxn],G[maxn],discovered;
int N,M;
int used[maxn],where[maxn];
void mark_plus(int x){ //mark with +
used[x]=1;
for(vector <int>::iterator it=Go[x].begin(); it!=Go[x].end();it++)
if(!used[*it])
mark_plus(*it);
discovered.push_back(x);
}
void mark_minus(int x, int cnt){
where[x]=cnt;
for(vector <int>::iterator it=Gi[x].begin(); it!=Gi[x].end();it++)
if(!where[*it])
mark_minus(*it,cnt);
}
int main()
{
int x,y,cnt=1;
cin>>N>>M;
for(;M--;){
cin>>x>>y;
Go[x].push_back(y);
Gi[y].push_back(x);
}
for(int i=1;i<=N;i++)
if(!used[i])
mark_plus(i);
for(;discovered.size();discovered.pop_back()){
if(!where[discovered.back()]){
mark_minus(discovered.back(),cnt);
cnt++;
}
}
for(int i=1;i<=N;++i)
G[where[i]].push_back(i);
cout<<cnt-1<<'\n';
for (int i=1;i<=N;++i) {
for (vector <int>::iterator it=G[i].begin();it!=G[i].end();++it)
cout<<*it<<" ";
cout << '\n';
}
}