Pagini recente » Cod sursa (job #1908323) | Cod sursa (job #219573) | Cod sursa (job #413983) | Cod sursa (job #948208) | Cod sursa (job #1379507)
//horatiu11
# include <cstdio>
# include <vector>
# include <stack>
# define nmax 100001
using namespace std;
int n,m,x,y,l,sol,Ind[nmax],Min_Ind[nmax];
vector <int>G[nmax],Rez[nmax];
stack <int>st;
bool viz[nmax];
inline void dfs(int x)
{
int val;
vector <int>::iterator it;
++l;
Ind[x]=Min_Ind[x]=l;
st.push(x);
viz[x]=true;
for(it=G[x].begin();it!=G[x].end();++it)
if(!Ind[*it])
{
dfs(*it);
Min_Ind[x]=min(Min_Ind[x],Min_Ind[*it]);
}
else if(viz[*it])Min_Ind[x]=min(Min_Ind[x],Min_Ind[*it]);
if(Ind[x]==Min_Ind[x])
{
++sol;
do{
val=st.top();st.pop();
viz[val]=false;
Rez[sol].push_back(val);
}while(x!=val);
}
}
int main()
{
int i;
vector <int>::iterator it;
freopen("ctc.in","r",stdin);
freopen("ctc.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i)
{
scanf("%d%d",&x,&y);
G[x].push_back(y);
}
for(i=1;i<=n;++i)
if(!Ind[i])
dfs(i);
printf("%d\n",sol);
for(i=1;i<=sol;++i)
{
for(it=Rez[i].begin();it!=Rez[i].end();++it)
printf("%d ",*it);
printf("\n");
}
return 0;
}