Pagini recente » Cod sursa (job #1871452) | Cod sursa (job #1742302) | Sisteme de ecuatii | Cod sursa (job #504418) | Cod sursa (job #1145024)
#include "fstream"
#include "vector"
#define mx 100000
using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
bool pls[mx], mns[mx], viz[mx];
int n,m, k;
vector<int> Sol[mx];
vector<int> G[mx], Gt[mx];
void Read()
{
int a,b;
f>>n>>m;
for(int i=0;i<m;i++)
{
f>>a>>b;
G[a].push_back(b);
Gt[b].push_back(a);
}
}
void DfsPlus(int nod)
{
for(int i=0;i<G[nod].size();i++)
{
if(!pls[G[nod][i]])
{
pls[G[nod][i]]=1;
DfsPlus(G[nod][i]);
}
}
}
void DfsMinus(int nod)
{
for(int i=0;i<Gt[nod].size();i++)
{
if(!mns[Gt[nod][i]])
{
mns[Gt[nod][i]]=1;
DfsMinus(Gt[nod][i]);
}
}
}
void Init()
{
for(int i=1;i<=n;i++)
pls[i]=mns[i]=0;
}
void Check()
{
k++;
for(int i=1;i<=n;i++)
{
if((mns[i])&&pls[i])
{
Sol[k].push_back(i);
viz[i]=1;
}
}
}
void SolveAll()
{
for(int i=1;i<=n;i++)
{
if(!viz[i])
{
DfsPlus(i);
/* for(int j=1;j<=n;j++)
g<<j<<' '<<pls[i]<<'\n';*/
DfsMinus(i);
Check();
Init();
}
}
}
void Write()
{
g<<k<<'\n';
for(int i=1;i<=k;i++)
{
for(int j=0;j<Sol[i].size();j++)
g<<Sol[i][j]<<' ';
g<<'\n';
}
}
int main()
{
Read();
SolveAll();
Write();
f.close();
g.close();
return 0;
}