Pagini recente » Borderou de evaluare (job #180161) | Borderou de evaluare (job #1405963) | Borderou de evaluare (job #1730167) | Borderou de evaluare (job #629863) | Cod sursa (job #3030231)
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
ifstream cin("ctc.in");
ofstream cout("ctc.out");
vector <int> G[100001],rez[100001],GT[100001];
int viz[100001],n,m,ctc;
stack <int> s;
void DFS(int start)
{
viz[start]=1;
for(unsigned int i=0; i<G[start].size(); ++i)
if(!viz[G[start][i]])
DFS(G[start][i]);
s.push(start);
}
void DFS_T(int start)
{
viz[start]=2;
rez[ctc].push_back(start);
for(unsigned int i=0; i<GT[start].size(); ++i)
if(viz[GT[start][i]]==1)
DFS_T(GT[start][i]);
}
int main()
{
cin>>n>>m;
while(m--)
{
int x,y;
cin>>x>>y;
G[x].push_back(y);
GT[y].push_back(x);
}
for(int i=1;i<=n;++i)
if(!viz[i])
DFS(i);
while(!s.empty())
{
int v = s.top();
if(viz[v]==1)
{
ctc++;
DFS_T(v);
}
s.pop();
}
cout<<ctc<<'\n';
for(int i=1;i<=ctc;++i,cout<<'\n')
{
for(auto it:rez[i])
cout<<it<<' ';
}
return 0;
}