Pagini recente » Monitorul de evaluare | Cod sursa (job #3329438) | Cod sursa (job #3334439) | Cod sursa (job #3328000) | Cod sursa (job #3349188)
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
const int NMAX=1e5+5;
int n,m,viz[NMAX],nrtopo;
vector<int>topo,comp[NMAX],v[NMAX],inv[NMAX];
void dfs(int nod){
viz[nod]=1;
for(auto f:v[nod]){
if(viz[f])continue;
dfs(f);
}
topo.push_back(nod);
}
void ctc(int nod){
viz[nod]=0;
for(auto f:inv[nod]){
if(viz[f]==0)continue;
ctc(f);
}
comp[nrtopo].push_back(nod);
}
int main()
{
fin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;
fin>>x>>y;
v[x].push_back(y);
inv[y].push_back(x);
}
for(int i=1;i<=n;i++)if(!viz[i])dfs(i);
topo.push_back(0);
reverse(topo.begin(),topo.end());
for(int i=1;i<=n;i++){
if(viz[topo[i]]==0)continue;
nrtopo++;
ctc(topo[i]);
}
fout<<nrtopo<<'\n';
for(int i=1;i<=nrtopo;i++){
for(int j=0;j<comp[i].size();j++)fout<<comp[i][j]<<' ';
fout<<'\n';
}
return 0;
}