Cod sursa(job #277642)

Utilizator alexandru92alexandru alexandru92 Data 11 martie 2009 20:23:43
Problema Parcurgere DFS - componente conexe Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<stdio.h>
#include<string.h>
#define Nmax  100001
int  n,v[Nmax],uz[Nmax],nr;
void DFS();
struct nod
{
	int info,ex;
	nod *urm;
};
typedef nod *Lista;
void Insert(Lista &prim,Lista p,int x)
{
	Lista q=new nod;
	q->info=x; q->ex=1;
	if(prim){q->urm=p->urm; p->urm=q;}
	else{q->urm=prim; prim=q;}
}
Lista L[Nmax],U[Nmax];
int main()
{int m,i,x,y;
	freopen("dfs.in","rt",stdin);
	freopen("dfs.out","wt",stdout);
	scanf("%d %d",&n,&m);
	for(i=1;i<=m;++i)
	{ scanf("%d %d",&x,&y);
	  if(L[x]) Insert(L[x],U[x],y),U[x]=U[x]->urm;
	  else Insert(L[x],NULL,y),U[x]=L[x];
	}
   for(i=1;i<=n;++i) if(L[i]==NULL) Insert(L[i],NULL,0);
	DFS();
	printf("%d",nr-1);
	return 0;
}
void DFS()
{
	int i,x,st;
	Lista p;
	for(i=1;i<=n;++i)
	  	if(L[i]->ex)
		  {v[1]=i; st=1;
	       while(st)
		       {
			     x=v[st--];
			     for(p=L[x];p;p=p->urm)
				     if(!uz[p->info]) p->ex=0,v[++st]=p->info, uz[p->info]=1;
		       }
	      nr++;
         L[i]->ex=0;
		   memset(uz,0,sizeof(uz));
	     }
}