Cod sursa(job #283450)

Utilizator dReaMerAndrei Sofian dReaMer Data 19 martie 2009 10:07:38
Problema Parcurgere DFS - componente conexe Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
# include <stdio.h>

int n,a[1010][1010],vizitat[1010],st[1010],vf,k,m,nr,nr1;

void citire(){
	int i,j,k,m;
 	scanf("%d%d",&n,&m);
	for(k=1;k<=m;k++){
 		scanf("%d%d",&i,&j);
		a[i][j]=a[j][i]=1;
	}
}
int cauta(){
	for(int i=1;i<=n;i++)
		if(vizitat[i]==0)
			return i;
	return 0;
}
void init(int k){
	vf=1;
	st[vf]=k;
	vizitat[k]=1;
}
int este_vida(){
	return vf==0;
}
void adaug(int i){
	vf++;
	st[vf]=i;
	vizitat[i]=1;
}
void elimin(){
	vf--;
}
void prelucrare(){
	int i=1,k=st[vf];
	while(i<=n && (a[i][k]==0 || (a[i][k]==1 && vizitat[i]==1))) i++;
	if(i==n+1)
		elimin();
	else {//printf("%d ",i);
		  nr++;
		  adaug(i);
	 }
}
int main(){
	freopen("dfs.in","r",stdin);
	freopen("dfs.out","w",stdout);
	citire();
	k=cauta();
	while(k){
		//nr1=0;
		m++;
		init(k);
		//scanf("%d ",&k);
		//printf("\nComponenta conexa:\n");
		//printf("%d : %d ",m,k);
		//if(nr>nr1)
			//nr1=nr;
		while(!este_vida()) prelucrare();
		k=cauta();
	}
	printf("%d",m);
	return 0;
}