Cod sursa(job #251070)

Utilizator FlorianFlorian Marcu Florian Data 1 februarie 2009 19:30:04
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#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)
 {
 node *q;
 for(q=G[nod];q;q=q->urm)
  {
   if(!viz[q->v])
    {
     viz[q->v]=1;
     df_timp(q->v);
     t=t+1;
    }
  }
 fin[nod]=t;
 }
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;
 for(i=1;i<=n;++i)
  if(!viz[i])
   {
    viz[i]=1;
    df_timp(i);
   }
 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;
 }