Pagini recente » Cod sursa (job #2314276) | Cod sursa (job #1614506) | Cod sursa (job #1975004) | Cod sursa (job #2441117) | Cod sursa (job #2870750)
#include <fstream>
#include <vector>
#include <deque>
#include <algorithm>
#include <climits>
#include <iomanip>
#include <cmath>
#define MOD 666013
#define INT_MAX 1000000000
using namespace std ;
ifstream cin ("ctc.in") ;
ofstream cout ("ctc.out") ;
int n, viz[100009] ;
vector<int> m[100009], rev[100009] ;
deque<int> dq ;
void dfs1(int nod)
{
if(viz[nod])return ;
viz[nod] = 1 ;
for(int f = 0 ; f < m[nod].size() ; f ++)
dfs1(m[nod][f]) ;
dq.push_back(nod) ;
}
vector<vector<int> > rez ;
void dfs2(int nod)
{
if(viz[nod]) return ;
viz[nod] = 1 ;
rez.back().push_back(nod) ;
for(int f = 0 ; f < rev[nod].size() ; f ++)
dfs2(rev[nod][f]) ;
}
int main()
{
int q ;
cin >> n >> q ;
while(q --)
{
int a, b ;
cin >> a >> b ;
m[a].push_back(b) ;
rev[b].push_back(a) ;
}
/// pasul 1, creearea dqului
for(int f = 1 ; f <= n ; f ++)
if(!viz[f])
dfs1(f) ;
for(int f = 1 ; f <= n ; f ++)
viz[f] = 0 ;
while(dq.size())
{
int nod = dq.back() ;
if(viz[nod])dq.pop_back() ;
else
{
vector<int> aux ;
rez.push_back(aux) ;
dfs2(nod) ;
}
}
cout << rez.size() << endl ;
for(int f = 0 ; f < rez.size() ; f ++)
{
for(int e = 0 ; e < rez[f].size() ; e ++)
cout << rez[f][e] << " " ;
cout << '\n' ;
}
return 0 ;
}
/// 1990