Fundamentos Estructurales

El Lenguaje de los Grafos: Vértices y Aristas

Un grafo G = (V, E) modela relaciones arbitrarias sin jerarquía fija. V son los vértices o nodos; E son las aristas o conexiones.

A B C D E
Grafo No Dirigido: Las conexiones son bidireccionales. (u, v) equivale a (v, u). Redes de amistad o carreteras doble mano.
Estructuras de Memoria

Matriz de Adyacencia vs Lista de Adyacencia

La elección depende de la densidad del grafo. Grafos densos (|E| ≈ |V|²) prefieren matrices; grafos dispersos (|E| ≪ |V|²) optimizan memoria con listas.

Grafo de 4 Nodos Click en aristas para activar/desactivar
A (0) B (1) C (2) D (3)
A (0) B (1) C (2) D (3)

Espacio: O(V²). Consulta de adyacencia: O(1).

Recorridos en Amplitud

BFS (Breadth-First Search): La Onda Expansiva

BFS expande capa por capa desde el origen usando una Cola FIFO. Encuentra el camino mínimo en cantidad de saltos.

Listo para iniciar BFS desde nodo 0 (A)
A (0) B (1) C (2) D (3) E (4) Nivel 0 Nivel 1 Nivel 2
Cola FIFO (Queue<Integer>)
[A]
En proceso Visitado No visitado
Orden de Visita
A
Recorridos en Profundidad

DFS (Depth-First Search): El Hilo de Ariadna

DFS avanza por una rama hasta topar con un callejón sin salida y luego retrocede (backtracking). Utiliza una Pila LIFO o la pila de llamadas (Call Stack).

Listo para explorar en profundidad
A (0) B (1) C (2) D (3) E (4)
Call Stack / Pila LIFO (Stack<Integer>)
dfs(A)
Acción Actual

Iniciamos en el nodo raíz A

Caminos Mínimos con Pesos

Algoritmo de Dijkstra: Relajación con PriorityQueue

Calcula la distancia mínima desde un nodo origen a todos los demás con pesos no negativos. Voraz (Greedy) con relajación de aristas.

4 2 1 5 8 10 2 3 A B C D E F
PriorityQueue<NodeDist>: (A, 0)
Vértice Distancia Tentativa Previo Cerrado

Nodo fuente A con distancia 0. Los demás a infinito (∞).

Programación Dinámica en Grafos

Algoritmo de Floyd-Warshall: Todos contra Todos

Calcula caminos mínimos entre todos los pares en O(V³). Evalúa progresivamente si pasar por el nodo intermedio k acorta la distancia entre i y j.

Regla de relajación con pivote k: D[i][j] = Math.min(D[i][j], D[i][k] + D[k][j])
D^(k) A B C
k = 0: Matriz directa de adyacencia sin vértices intermedios.