Pagini recente » Cod sursa (job #2082514) | Cod sursa (job #1378207) | Cod sursa (job #2161218) | Cod sursa (job #2592974) | Cod sursa (job #2198036)
#include <stdio.h>
#include <iostream>
#include <vector>
#include <deque>
#include <cstring>
#include <queue>
using namespace std;
FILE *f,*g;
vector <int> ctc[100010];
deque <int> coada;
int fr[100010];
int start1[200010],start2[200010];
int t1[2][200010],t2[2][200010];
int nn,sol=0;
void DFS(int nod)
{
int i=start1[nod];
fr[nod]=1;
while(i)
{
if(!fr[t1[0][i]])
{
fr[t1[0][i]]=1;
DFS(t1[0][i]);
}
else
i=t1[1][i];
}
coada.push_back(nod);
}
void DFST (int nod)
{
int i=start2[nod];
fr[nod]=1;
while(i)
if(!fr[t2[0][i]])
{
fr[t2[0][i]]=1;
DFST(t2[0][i]);
}
else
i=t2[1][i];
ctc[sol].push_back(nod);
}
void Afisare(int n)
{
int i,j;
int k;
for(i=1,k=ctc[1].size();i<=n;i++,k=ctc[i].size(),fprintf(g,"\n"))
{
for(j=0;j<k;j++)
fprintf(g,"%d ",ctc[i][j]);
}
}
int main()
{
f=fopen("ctc.in","r");g=fopen("ctc.out","w");
int n,m,i,nr=0,x,y;
fscanf(f,"%d %d",&n,&m);
memset(fr,0,sizeof(fr));
for(i=1;i<=m;i++)
{
fscanf(f,"%d %d",&x,&y);
t1[0][i]=y;
t1[1][i]=start1[x];
start1[x]=i;
t2[0][i]=x;
t2[1][i]=start2[y];
start2[y]=i;
}
for(i=1;i<=n;i++)
if(!fr[i])
DFS(i);
memset(fr,0,sizeof(fr));
int nod;
while(!coada.empty())
{
nn=nod=coada.back();
if(!fr[nod])
{
++sol;
DFST(nod);
}
coada.pop_back();
}
fprintf(g,"%d\n",sol);
Afisare(sol);
fclose(f),fclose(g);
return 0;
}