Cod sursa(job #359680)

Utilizator petroMilut Petronela petro Data 27 octombrie 2009 23:18:14
Problema Parcurgere DFS - componente conexe Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<stdio.h>
#define M 100000

FILE *f=fopen("dfs.in","r");
FILE *g=fopen("dfs.out","w");

long n,m;
long viz[M],x[M*10],y[M*10];

void citire()
{
	long i;
	fscanf(f,"%ld%ld",&n,&m);
	
	for(i=1;i<=m;i++)
		fscanf(f,"%ld%ld",&x[i],&y[i]);
	
	for(i=1;i<=n;i++)
		viz[i]=-1;
	
	fclose(f);
}

void dfs(long nod, long nr, long &u)
{
	long i,c[M*10],p;
	p=u=1;
	viz[nod]=nr;
	c[p]=nod;
	
	while(p<=u)
	{
		nod=c[p];
		for(i=1;i<=m;i++)
			if(x[i]==nod&& viz[y[i]]==-1) {u++;
		                   c[u]=y[i];
			               viz[y[i]]=nr;}
		   else if(y[i]==nod && viz[x[i]]==-1) {u++;
		                   c[u]=x[i];
			               viz[x[i]]=nr;}
		
		p++;
	}
}

int main()
{
	citire();
	long nr,p,i, nod;
	nr=nod=1;
	
	dfs(nod,nr,i);
	
	int ok=1;
	while(ok)
	{
		long k=0,t;
		for(i=1;i<=n;i++)
			if(viz[i]==-1) {p=i;k++;}
		
		if(k!=0) {nr++;
		          nod=p;
			      dfs(nod,nr,t);
			      } 
		if(t==k) ok=0;
		else ok=1;
	}
	
	fprintf(g,"%ld\n",nr);
	fclose(g);
	return 0;
}