Cod sursa(job #202960)

Utilizator shade4529Popescu Mihai shade4529 Data 12 august 2008 14:15:33
Problema Parcurgere DFS - componente conexe Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<stdio.h>
FILE *f,*g;
long z,j,vt,plus[100005],minus[100005],x,c[100005],ct[100005],t[3][200005],tt[3][200005],viz[100005],n,m,nr,nrt,i,y,v;
int dfs1(long k)
{ long v;
  plus[k]=x; v=c[k];
  while(t[2][v]!=0)
   { if(!(viz[t[1][v]]||plus[t[1][v]]==x)) dfs1(t[1][v]);
     v=t[2][v];
   }
  if(!(viz[t[1][v]]||plus[t[1][v]]==x)) dfs1(t[1][v]);
  return 0;
}
int dfs2(long k)
{ long v;
  minus[k]=x; v=ct[k];
  while(tt[2][v]!=0)
   { if(!(viz[tt[1][v]]||minus[tt[1][v]]==x)) dfs2(tt[1][v]);
     v=tt[2][v];
   }
  if(!(viz[tt[1][v]]||minus[tt[1][v]]==x)) dfs2(tt[1][v]);
  return 0;
} 

int main()
{ f=fopen("dfs.in","r"); g=fopen("dfs.out","w");
  fscanf(f,"%ld%ld",&n,&m); nr=1; nrt=1;
  for(i=1;i<=m;i++)
   { fscanf(f,"%ld%ld",&x,&y);
     if(!c[x])
      { while(t[1][nr]!=0) nr++;
	c[x]=nr;
	t[1][nr]=y;
      }
     else
      { v=c[x];
	while(t[2][v]!=0) v=t[2][v];
	while(t[1][nr]!=0) nr++;
	t[2][v]=nr; t[1][nr]=y;
      }
     z=x; x=y; y=z;
     if(!ct[x])
      { while(tt[1][nrt]!=0) nrt++;
	ct[x]=nrt;
	tt[1][nrt]=y;
      }
     else
      { vt=ct[x];
	while(tt[2][vt]!=0) vt=tt[2][vt];
	while(tt[1][nrt]!=0) nrt++;
	tt[2][vt]=nrt; tt[1][nrt]=y;
      }
   }
  nr=0;
  for(i=1;i<=n;i++)
   { if(!viz[i])
      { nr++; x++;
	dfs1(i); dfs2(i);
	for(j=1;j<=n;j++) if(minus[j]==x&&plus[j]==x) viz[j]=1;
      }
   }
  fprintf(g,"%ld",nr);
  fclose(g);
  return 0;
}