Pagini recente » Cod sursa (job #2637754) | Cod sursa (job #2565303) | Cod sursa (job #1350389) | Cod sursa (job #1194254) | Cod sursa (job #2134842)
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <fstream>
#define _1 first
#define _2 second
#define nMax 100003
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
int n, m, nr_ordine = 0;
bool viz[nMax] = {};
int idx[nMax];
vector < vector < int > > v, rv;
vector < vector < int > > sol;
auto cmp = [](pair < int, int > a, pair < int, int > b){return a.first < b.first;};
priority_queue < pair < int, int > , vector < pair< int, int > >, decltype(cmp) > heap(cmp);
void r_dfs(int nod){
viz[nod] = true;
sol[sol.size() - 1].push_back(nod);
for(int i = 0; i < rv[nod].size(); i ++){
if(!viz[rv[nod][i]]){
r_dfs(rv[nod][i]);
}
}
return;
}
void dfs(int nod){
viz[nod] = true;
for(int i = 0; i < v[nod].size(); i ++){
if(!viz[v[nod][i]]){
dfs(v[nod][i]);
}
}
idx[nod] = ++ nr_ordine;
return;
}
void tarjan(){
pair < int, int > now;
for(int i = 1; i <= n; i ++){
if(!viz[i]){
dfs(i);
}
}
for(int i = 1; i <= n; i ++){
heap.push(make_pair(idx[i], i));
}
memset(viz, 0, sizeof(viz));
while(!heap.empty()){
now = heap.top();
heap.pop();
if(viz[now.second]){
continue;
}
sol.resize(sol.size() + 1);
r_dfs(now.second);
}
return;
}
int main(){
int m;
fin>>n>>m;
v.resize(n + 1);
rv.resize(n + 1);
for(int i = 1, x, y; i <= m; i ++){
fin>>x>>y;
v[x].push_back(y);
rv[y].push_back(x);
}
tarjan();
fout<<sol.size()<<"\n";
for(int i = 0; i < sol.size(); i ++){
for(int j = 0; j < sol[i].size(); j ++){
fout<<sol[i][j]<<" ";
}
fout<<"\n";
}
return 0;
}