Pagini recente » Cod sursa (job #2489068) | Cod sursa (job #1247164) | Cod sursa (job #1113140) | Cod sursa (job #748842) | Cod sursa (job #3033146)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
vector<vector<int>> l(300001), lt(300001), cmps;
int visited[300001]={0};
stack<int> q={};
int n,m;
void dfs1(int x){
if(visited[x]==0) {
visited[x] = 1;
for (const auto &item: l[x]) {
if (visited[item] == 0) {
dfs1(item);
}
}
q.push(x);
}
}
void dfs2(int x,vector<int> &cmp){
if(visited[x]==0)
cmp.push_back(x);
visited[x]=1;
for (const auto &item: lt[x]) {
if(visited[item]==0){
dfs2(item,cmp);
}
}
}
int main(){
fin>>n>>m;
for(int i = 0;i<m; ++i){
int x,y;
fin>>x>>y;
l[x].push_back(y);
lt[y].push_back(x);
}
for(int i =1;i<=n;++i){
if(visited[i]==0)
dfs1(i);
}
int c= 0;
memset(visited,0,sizeof(visited));
while(!q.empty()){
int k = q.top();
q.pop();
vector<int> cmp={};
if(visited[k]==0) {
dfs2(k, cmp);
c+=1;
cmps.push_back(cmp);
}
}
fout<<c;
for (const auto &item: cmps) {
fout<<endl;
for (const auto &item1: item) {
fout<<item1<<" ";
}
}
}