Pagini recente » Cod sursa (job #1518083) | Cod sursa (job #2346377) | Cod sursa (job #928540) | Cod sursa (job #2575407) | Cod sursa (job #1267156)
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
FILE *f=fopen("ctc.in","r");
FILE *g=fopen("ctc.out","w");
int viz2[100001],postordine2[100001],postordine[100001],viz[100001],k=0,n,m,i,x,y,nr=0;
vector <int> a[100001],b[100001];
void dfst(int x, int ok)
{
int i;
viz[x]=0;
if(ok==2) fprintf(g,"%d ",x);
for(i=0;i<b[x].size();i++)
if(viz[b[x][i]])dfst(b[x][i],ok);
}
void dfs(int x)
{
int i;
viz[x]=1;
for(i=0;i<a[x].size();i++)
if(!viz[a[x][i]])dfs(a[x][i]);
postordine[++k]=x;
}
int main()
{
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=m;i++)
{
fscanf(f,"%d%d",&x,&y);
a[x].push_back(y);
b[y].push_back(x);
}
for(i=1;i<=n;i++)
if(!viz[i]) dfs(i);
for(i=1;i<=n;i++)
{
viz2[i]=viz[i];
postordine2[i]=postordine[i];
}
for(i=n;i>0;i--)
if(viz[postordine[i]])
{
dfst(postordine[i],1);
nr++;
}
fprintf(g,"%d\n",nr);
swap(viz,viz2);
swap(postordine,postordine2);
for(i=n;i>0;i--)
if(viz[postordine[i]])
{
dfst(postordine[i],2);
fprintf(g,"\n");
}
fclose(g);
return 0;
}