#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 #1 (matriz de adyacencias)             */
/*-------------------------------------------------------------------*/

/*-------------------------------------------------------------------*/
/*                      ESTRUCTURAS DE DATOS                         */
/*-------------------------------------------------------------------*/

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

#define MAX 25			/* Numero maximo de vertices */

typedef struct
{	TipoG info;		/* Información asociada con un vértice */
	int marca;		/* Marca del vértice */
} Vertice;		

typedef struct
{	int **arcos;		/*Matriz de cualquier tamaño, pedida en ejecución */
	Vertice *vertices;	/* Vector de vértices de cualquier tamaño, pedido en ejecución */
 	int numElem;		/* Número de vértices */
 	int capacidad;		/* Tamaño de las estructuras de datos */
} TGrafo, *Grafo;

#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
