#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;
}