Pagini recente » Cod sursa (job #1691801) | Cod sursa (job #1804676) | Cod sursa (job #639178) | Cod sursa (job #1595653) | Cod sursa (job #525748)
Cod sursa(job #525748)
#include <stdio.h>
#include <vector>
#include <stack>
#define NMax 100000
using namespace std;
const char IN[]="ctc.in",OUT[]="ctc.out";
int N,M,Sols;
int indx;
int ind[NMax] , lowlink[NMax];
bool inStack[NMax];
vector<int> v[NMax];
vector< vector<int> > Sol;
vector<int> s;
stack<int> S;
int min(int x,int y)
{
return x<y ? x : y;
}
void tarjan(int x)
{
vector<int>::iterator it;
ind[x]= lowlink[x]= ++indx;
inStack[x]=true;
S.push(x);
for ( it = v[x].begin() ; it<v[x].end() ; ++it)
if ( !ind[*it] )
tarjan(*it),
lowlink[x]= min(lowlink[x],lowlink[*it]);
else if ( inStack[*it] )
lowlink[x]= min(lowlink[x],lowlink[*it]);
if ( lowlink[x] == ind[x])
{
s.clear();
++Sols;
int vp = -1;
while (vp != x)
{
vp=S.top();S.pop();
//printf("%d ",vp+1);
s.push_back(vp+1);
}
Sol.push_back(s);
}
}
int main()
{
int i,x,y;
freopen(IN,"r",stdin);
scanf("%d%d",&N,&M);
for (i=0;i<M;++i)
{
scanf("%d%d",&x,&y);
v[x-1].push_back(y-1);
}
for (i=0;i<N;++i) if ( !ind[i])
tarjan(i);
freopen(OUT,"w",stdout);
printf("%d\n",Sols);
for (i=0;i<Sols;++i)
{
for ( vector<int>::iterator it = Sol[i].begin() ; it<Sol[i].end();++it)
printf("%d ",*it);
printf("\n");
}
fclose(stdout);
return 0;
}