Pagini recente » Cod sursa (job #123141) | Cod sursa (job #1110362) | Cod sursa (job #2732758) | Cod sursa (job #2835753) | Cod sursa (job #2761045)
#include<cstdio>
#include<vector>
#include<stack>
#include<cstring>
#include<queue>
#include<iterator>
using namespace std;
FILE*in=fopen("ctc.in","r");
FILE*out=fopen("ctc.out","w");
int n,m,i,x,y,ct,j;
bool viz[100005];
int comp[100005];
stack<int> s;
vector<int> v[100005],rev[100005],ras[100005];
vector<int>::iterator it;
void dfs(int nod)
{
viz[nod]=1;
for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();++it)
{
if(viz[*it]==0)
{
dfs(*it);
}
}
s.push(nod);
}
void ctcf(int nod)
{
ras[ct].push_back(nod);
viz[nod]=1;
for(vector<int>::iterator it=rev[nod].begin();it!=rev[nod].end();++it)
{
if(viz[*it]==0)
{
ctcf(*it);
}
}
}
int main()
{
fscanf(in,"%d%d",&n,&m);
for(i=1;i<=m;i++)
{
fscanf(in,"%d%d",&x,&y);
v[x].push_back(y);
rev[y].push_back(x);
}
for(i=1;i<=n;i++)
{
if(viz[i]==0)
{
dfs(i);
}
}
memset(viz,0,sizeof(viz));
ct=0;
while(!s.empty())
{
ctcf(s.top());
s.pop();
while(!s.empty()&&viz[s.top()]==1)
{
s.pop();
}
ct++;
}
fprintf(out,"%d\n",ct);
for(i=0;i<ct;i++)
{
for(j=0;j<ras[i].size();j++)
{
fprintf(out,"%d ",ras[i][j]);
}
fprintf(out,"\n");
}
}