Conceptos básicos de grafos: tipos y aplicaciones prácticas

Clase 26 de 29Curso de Estructuras de Datos con JavaScript

Resumen

Entender grafos puede ser tan directo como trabajar con nodos en otras estructuras. Con una base en Binary Search Tree y linked lists, verás que los grafos son nodos interconectados con reglas claras. Aquí se explican sus componentes y tipos con ejemplos cotidianos, para que pases de la teoría a la implementación con confianza.

¿Qué es un grafo y cuáles son sus componentes?

Un grafo es una estructura formada por nodos y conexiones. Si ya creaste una clase para un nodo y generaste instancias, estás a un paso de dominar grafos: solo añadimos cómo se conectan.

¿Qué son vértices y edges?

  • Los vértices son los nodos del grafo.
  • Los bordes o edges son las conexiones entre vértices.
  • Un borde actúa como un pointer que une un nodo con otro.
  • Con vértices y bordes formamos la estructura completa del grafo.

¿Por qué no son complejos los grafos?

  • Reutilizan ideas de estructuras vistas: nodos y referencias.
  • La clave está en entender sus reglas de conexión.
  • Una vez implementados, resultan más sencillos de lo que parecen.

¿Cómo se relacionan con linked lists?

  • Un grafo dirigido recuerda a una single linked list: una sola dirección de avance.
  • Un grafo no dirigido evoca una double linked list: puedes ir y volver entre nodos.

¿Qué tipos de grafos existen y cómo se comparan?

Elegir el tipo correcto depende de la dirección de las conexiones, la presencia de pesos y la existencia de ciclos. Con ejemplos, la diferencia se vuelve evidente.

¿Cómo se diferencian grafos dirigidos y no dirigidos?

  • Dirigidos: un nodo lleva a otro con dirección específica. Similar a Twitter: si sigues a alguien, no implica acceso mutuo.
  • No dirigidos: la conexión es bidireccional. Similar a Facebook: al conectar, ambos acceden a la información del otro.
  • Beneficio: modelas relaciones asimétricas o simétricas según el caso.

¿Qué aportan grafos ponderados y no ponderados?

  • Ponderados: las aristas tienen un peso (por ejemplo, un valor numérico).
  • No ponderados: sin peso asociado; todas las conexiones valen lo mismo.
  • Ejemplo práctico: rutas de aerolíneas para ahorrar gasolina.
  • Cada aeropuerto es un vértice.
  • Cada borde ponderado representa el costo en combustible entre aeropuertos.
  • Objetivo: elegir la ruta con menor gasto total.

¿Qué distingue un grafo cíclico de uno acíclico?

  • Cíclico: puedes partir de un nodo, recorrer y volver al inicio formando un ciclo.
  • Acíclico: no existe forma de regresar al punto de origen tras recorrer el grafo.
  • Entender ciclos ayuda a planear recorridos y evitar bucles no deseados.

¿Cómo construiremos y representaremos el grafo en código?

El siguiente paso es crear un grafo no dirigido, pequeño y claro, reutilizando clases e instancias de nodos. Antes de programar, conviene saber cómo se representan para imprimirlos o visualizarlos.

¿Qué haremos al construir un grafo no dirigido?

  • Definir nodos como vértices.
  • Conectar pares con bordes bidireccionales.
  • Mantener el ejemplo sencillo para enfocarnos en la lógica de conexiones.

¿Qué habilidades pondrás en práctica?

  • Modelar vértices y bordes con clases e instancias.
  • Distinguir dirigido vs no dirigido según la relación.
  • Asignar pesos cuando se necesiten decisiones de costo.
  • Identificar ciclos para detectar posibles vueltas al origen.
  • Traducir analogías de Facebook y Twitter a reglas de conexión.

¿Cómo veremos las representaciones de grafos?

  • Existen tres formas comunes de representación.
  • Se mostrarán antes de escribir código para que el formato de salida sea claro.

¿Con qué ejemplo te identificaste más: Facebook, Twitter o rutas de aerolíneas? Comenta cómo modelarías tu propio grafo no dirigido y qué tipo de conexiones usarías.