Dijkstra en C: ejercicio resuelto
Dijkstra en C: ejercicio resuelto
Si buscas Dijkstra en C ejercicio resuelto, aquí tienes la implementación clásica con matriz de adyacencia: encuentra el camino más corto desde un nodo origen hasta todos los demás nodos de un grafo dirigido y ponderado con pesos no negativos.
La implementación con matriz es O(V²), adecuada para grafos densos o pequeños. Para grafos dispersos grandes se usa una cola de prioridad (min-heap), que da O((V + E) log V).
Enunciado
Dado un grafo de 5 nodos (0–4) con las siguientes aristas:
Encuentra las distancias mínimas desde el nodo 0 a todos los demás usando Dijkstra.
Solución en C
Resultado esperado
Errores frecuentes
- Usar pesos negativos: Dijkstra no funciona correctamente con aristas de peso negativo. Para ese caso se usa el algoritmo de Bellman-Ford.
- No inicializar todas las distancias a INF antes de empezar: distancias sin inicializar producen caminos incorrectos.
- Sumar
INF + pesosin comprobar quedist[u] != INF: produce desbordamiento de entero. - Confundir grafos dirigidos con no dirigidos en la matriz: si el grafo es no dirigido,
grafo[u][v] == grafo[v][u].
Aplicación práctica
Dijkstra es el algoritmo estándar para navegación GPS, enrutamiento de redes (OSPF), juegos de estrategia (búsqueda de caminos en mapas) y cualquier problema de camino mínimo con pesos no negativos. La versión con cola de prioridad es la que se usa en producción para grafos grandes.
Siguiente ejercicio recomendado
- Búsqueda binaria en C: ejercicio resuelto
- Algoritmo de Euclides (MCD) en C: ejercicio resuelto
- Merge sort en C: ejercicio resuelto
- Todos los ejercicios de C
Práctica guiada y libro completo
Si quieres una ruta completa con progresión real de dificultad:
FAQ
¿Por qué Dijkstra no funciona con pesos negativos?
Porque el algoritmo asume que una vez que un nodo se marca como visitado, su distancia ya es la mínima posible. Con pesos negativos podría existir un camino más corto que llegue a ese nodo más tarde, violando esa suposición. Bellman-Ford maneja pesos negativos en O(V·E).
¿Cuándo usar la versión con cola de prioridad frente a la de matriz?
La versión con cola de prioridad (min-heap) es O((V + E) log V) y se prefiere para grafos dispersos donde E « V². La versión con matriz es O(V²) y es más sencilla de implementar; es aceptable cuando V es pequeño (< 1000) o el grafo es denso.
¿Cómo reconstruir el camino, no solo la distancia?
Se añade un array predecesor[V] inicializado a -1. Cuando se relaja una arista y se actualiza dist[v], se guarda predecesor[v] = u. Al final, se recorre el array de predecesores desde el destino hasta el origen para obtener la ruta.