#ifndef __GRAFO_H
#define __GRAFO_H
/*-------------------------------------------------------------------*/
/* "DISENO Y MANEJO DE ESTRUCTURAS DE DATOS EN C" - V. 1.0           */
/* Prof. Jorge Villalobos - Universidad de los Andes                 */
/*-------------------------------------------------------------------*/
/* TAD Grafo - Implementacion #2 (Listas de sucesores                */
/*-------------------------------------------------------------------*/

/*-------------------------------------------------------------------*/
/*                      ESTRUCTURAS DE DATOS                         */
/*-------------------------------------------------------------------*/
#define MAX 25			/* Numero maximo de vertices */

typedef struct 
{	int vertice;		/* Vértice sucesor */
	int costo;		/* Costo del arco */
} TipoLP;

#include "ListaP.h"		/* #include TAD Lista[ sucesor, costo ] */

typedef struct
{	TipoG info;		/* Información asociada con el vértice */
	int marca;		/* Marca */
	ListaP sucesores;	/* Lista de parejas [ sucesor, costo ] */
} Vertice;

typedef struct
{	Vertice *vertices;	/* Vector de tamaño dinámico de vértices */
	int numElem;		/* Orden del grafo */
} TGrafo, *Grafo;

typedef int TipoL;
#include "Lista1.h"		/* #include TAD Lista[ int ] */

#include <stdio.h>

/*-------------------------------------------------------------------*/
/*                             OPERACIONES                           */
/*-------------------------------------------------------------------*/

/* Constructora */
Grafo inicGrafo( void );

/* Modificadoras */
void insVertice( Grafo g, TipoG elem );
void insArco( Grafo g, int x1, int x2, int c );
void elimArco( Grafo g, int x1, int x2 );
void marcarVertice( Grafo g, int v );
void desmarcarVertice( Grafo g, int v );
void desmarcarGrafo( Grafo g );

/* Analizadoras */
int costoArco( Grafo g, int x1, int x2 );
Lista sucesores( Grafo g, int v );
TipoG infoVertice( Grafo g, int v );
int ordenGrafo( Grafo g );
int marcadoVertice( Grafo g, int v );

/* Destructora */
void destruirGrafo( Grafo g );

/* Persistencia */
Grafo cargarGrafo( FILE *fp );
void salvarGrafo( Grafo g, FILE *fp );

/* Depuracion */
void impGrafo( Grafo g );

/*-------------------------------------------------------------------*/
#endif
