#include <stdio.h>
#include <stdlib.h>
// Nodo para representar una conexión entre sucursales
typedef struct Nodo {
int destino;
struct Nodo* siguiente;
} Nodo;
// Estructura para representar una sucursal y sus conexiones
typedef struct {
int id;
char nombre[50];
Nodo* listaAdyacencia; // Lista de nodos adyacentes
} Sucursal;
// Estructura principal del grafo
typedef struct {
int numSucursales;
Sucursal* sucursales;
} Grafo;
// Funciones para manejar el grafo
Grafo* crearGrafo(int numSucursales) {
Grafo* grafo = (Grafo*)malloc(sizeof(Grafo));
grafo->numSucursales = numSucursales;
grafo->sucursales = (Sucursal*)malloc(numSucursales * sizeof(Sucursal));
for (int i = 0; i < numSucursales; ++i) {
grafo->sucursales[i].id = i + 1; // IDs de sucursales empiezan desde 1
printf("Ingrese el nombre de la sucursal %d: ", grafo->sucursales[i].id);
scanf("%s", grafo->sucursales[i].nombre);
grafo->sucursales[i].listaAdyacencia = NULL; // Inicializar lista de adyacencia
}
return grafo;
}
void agregarConexion(Grafo* grafo, int origen, int destino) {
if (origen < 1 || origen > grafo->numSucursales || destino < 1 || destino > grafo->numSucursales) {
printf("Error: Sucursal no válida\n");
return;
}
Nodo* nuevoNodo = (Nodo*)malloc(sizeof(Nodo));
nuevoNodo->destino = destino;
nuevoNodo->siguiente = grafo->sucursales[origen - 1].listaAdyacencia;
grafo->sucursales[origen - 1].listaAdyacencia = nuevoNodo;
}
void mostrarGrafo(Grafo* grafo) {
printf("Grafo de sucursales:\n");
for (int i = 0; i < grafo->numSucursales; ++i) {
printf("Sucursal %d (%s): ", grafo->sucursales[i].id, grafo->sucursales[i].nombre);
Nodo* actual = grafo->sucursales[i].listaAdyacencia;
while (actual != NULL) {
printf(" -> Sucursal %d", actual->destino);
actual = actual->siguiente;
}
printf("\n");
}
}
int main() {
int numSucursales;
printf("Ingrese la cantidad de sucursales: ");
scanf("%d", &numSucursales);
Grafo* grafo = crearGrafo(numSucursales);
// Agregar conexiones (puedes personalizar esta parte)
agregarConexion(grafo, 1, 2);
agregarConexion(grafo, 1, 3);
agregarConexion(grafo, 2, 3);
agregarConexion(grafo, 3, 1);
mostrarGrafo(grafo);
// Liberar memoria
for (int i = 0; i < numSucursales; ++i) {
Nodo* actual = grafo->sucursales[i].listaAdyacencia;
while (actual != NULL) {
Nodo* siguiente = actual->siguiente;
free(actual);
actual = siguiente;
}
}
free(grafo->sucursales);
free(grafo);
return 0;
}