/*-------------------------------------------------------------------*/
/* "DISENO Y MANEJO DE ESTRUCTURAS DE DATOS EN C" - V. 1.0           */
/* Prof. Jorge Villalobos - Universidad de los Andes                 */
/*-------------------------------------------------------------------*/
/*  Cap 6 - Recorrido por niveles de un grafo                        */
/*-------------------------------------------------------------------*/

typedef int TipoG;		/* #include TAD Grafo[ int ] */
#include "Grafo1.h"

#include <stdio.h>

#define TRUE 1
#define FALSE 0

/*-------------------------------------------------------------------*/

static void nivelesVertice( Grafo g, int v )
{	int x;
	Lista lst, frente = inicLista( );
	anxLista( frente, v );
	while( longLista( frente ) != 0 )
	{	primLista( frente );
		x = infoLista( frente );
		elimLista( frente );
		if( marcadoVertice( g, x ) )
			continue;
		printf( "%d ", infoVertice( g, x ) );
		marcarVertice( g, x );
		lst = sucesores( g, x );
		for ( ultLista( frente ), primLista( lst ); !finLista( lst ); elimLista( lst ) )
			if ( !marcadoVertice( g, infoLista( lst ) ) )
				anxLista( frente, infoLista( lst ) );
	} 
}

/*-------------------------------------------------------------------*/

void nivelesGrafo( Grafo g, int v )
{	int i, numVert = ordenGrafo( g );
	desmarcarGrafo( g );
	nivelesVertice( g, v );
	for ( i = 1; i <= numVert; i++ )
		if ( !marcadoVertice( g, i ) )
			nivelesVertice( g, i );
	printf("\n");
}

/*-------------------------------------------------------------------*/
/*                        PROGRAMA DE PRUEBA                         */
/*-------------------------------------------------------------------*/

void main( void )
{	int v;
	FILE *fp = fopen( "grafo1.txt", "r" );
	Grafo g = cargarGrafo( fp );
	do
	{	printf("Vertice de partida (0 para terminar): ");
		scanf("%d",&v);
		if( v == 0 ) return;
		nivelesGrafo( g, v );
	} while( TRUE );
}
