Pagini recente » Cod sursa (job #3180651) | Cod sursa (job #913066) | Cod sursa (job #2461537) | Cod sursa (job #496391) | Cod sursa (job #251081)
Cod sursa(job #251081)
#include<stdio.h>
#include<string.h>
#define Nmax 100003
FILE*f=fopen("ctc.in","r");
FILE*g=fopen("ctc.out","w");
struct node
{
int v;
node *urm;
};
node *G[Nmax], *Gt[Nmax], *C[Nmax];
int t=1,n,m,nr;
int viz[Nmax], fin[Nmax], ord[Nmax];
int ins(int x, int y) // nodul x face parte din componenta y
{
node *q;
q=new node;
q->v=x;
q->urm=C[y];
C[y]=q;
}
int insert(int x, int y)
{
node *p=new node;
p->v=y;
p->urm=G[x];
G[x]=p;
node *q=new node;
q->v=x;
q->urm=Gt[y];
Gt[y]=q;
}
void read()
{
fscanf(f,"%d %d",&n,&m);
int x,y;
while(m--)
{
fscanf(f,"%d%d",&x,&y);
insert(x,y);
}
}
void df_timp(int nod, int &timp)
{
node *q;
for(q=G[nod];q;q=q->urm)
{
if(!viz[q->v])
{
viz[q->v]=1;
df_timp(q->v, timp);
timp=timp+1;
}
}
fin[nod]=timp;
}
void sort()
{
int i;
for(i=1;i<=n;++i) ord[n-fin[i]+1] = i;
}
void dfs(int nod)
{
node *q;
for(q=Gt[nod];q;q=q->urm)
if(!viz[q->v])
{
viz[q->v]=1;
ins(q->v,nr);
dfs(q->v);
}
}
void componente()
{
int i;
int timp=1;
for(i=1;i<=n;++i)
if(!viz[i])
{
viz[i]=1;
df_timp(i, timp);
}
sort();
memset(viz,0,sizeof(viz));
for(i=1;i<=n;++i)
{
if(!viz[ord[i]])
{
nr++;
ins(ord[i],nr);
viz[ord[i]]=1;
dfs(ord[i]);
}
}
}
void print()
{
fprintf(g,"%d\n",nr);
node *q;
int i;
for(i=1;i<=nr;++i)
{
for(q=C[i];q;q=q->urm)
fprintf(g,"%d ",q->v);
fprintf(g,"\n");
}
}
int main()
{
read();
componente();
print();
return 0;
}