Pagini recente » Cod sursa (job #523743) | Cod sursa (job #651643) | Cod sursa (job #1266636) | Cod sursa (job #2904374) | Cod sursa (job #1480469)
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100005
vector<int> G[MAXN], Gt[MAXN];
bitset<MAXN> Viz1, Viz2;
int ctc;
int In[MAXN];
vector<int> Nodes[MAXN];
void dfs1(int node) {
Viz1[node] = 1;
for(auto vec : G[node])
if(!Viz1[vec])
dfs1(vec);
}
void dfs2(int node) {
if(Viz1[node]) {
In[node] = ctc;
Nodes[ctc].push_back(node);
}
Viz2[node] = 1;
for(auto vec : Gt[node])
if(!Viz2[vec])
dfs2(vec);
}
int main() {
//#ifndef ONLINE_JUDGE
freopen("ctc.in", "r", stdin);
freopen("ctc.out", "w", stdout);
//#endif
int n, m, a, b;
cin>>n>>m;
while(m--) {
cin>>a>>b;
G[a].push_back(b);
Gt[b].push_back(a);
}
for(int i=1; i<=n; i++) {
if(!In[i]) {
ctc++;
dfs1(i);
dfs2(i);
Viz1.reset();
Viz2.reset();
}
}
cout<<ctc<<'\n';
for(int i=1; i<=ctc; i++) {
for(auto node : Nodes[i]) cout<<node<<" ";
cout<<'\n';
}
return 0;
}