Pagini recente » Cod sursa (job #2647386) | Cod sursa (job #243582) | Cod sursa (job #1103464) | Cod sursa (job #40724) | Cod sursa (job #1991751)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#define NMAX 100005
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
int n,m,k,ind;
int low[NMAX],inst[NMAX],h[NMAX];
vector <int> v[NMAX],rsp[NMAX];
stack <int> st;
void read()
{
fin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
fin>>x>>y;
v[x].push_back(y);
}
for(int i=1;i<=n;i++)h[i]=-1;
}
void write()
{
fout<<k<<"\n";
for(int i=1;i<=k;i++)
{
for(vector<int>::iterator it=rsp[i].begin();it!=rsp[i].end();it++)
fout<<*it<<" ";
fout<<"\n";
}
}
void ctc(int nod)
{
h[nod]=low[nod]=ind;
ind++;
st.push(nod);
inst[nod]=1;
for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
{
int nr=*it;
if(h[nr]==-1)
{
ctc(nr);
low[nod]=min(low[nod],low[nr]);
}
else if(inst[nr])low[nod]=min(low[nod],low[nr]);
}
if(low[nod]==h[nod])
{
k++;
while(st.top()!=nod)
{
rsp[k].push_back(st.top());
inst[st.top()]=0;
st.pop();
}
rsp[k].push_back(st.top());
inst[st.top()]=0;
st.pop();
}
}
int main()
{
read();
ind=1;
for(int i=1;i<=n;i++)
if(h[i]==-1)
ctc(i);
write();
return 0;
}