41. Aplicaciones de conjuntos en teoría de grafos

La teoría de grafos usa conjuntos para representar vértices, aristas, relaciones, caminos, vecindades y conexiones entre objetos.

41.1 Introducción

Un grafo es una estructura matemática que permite representar objetos y conexiones entre ellos. La teoría de conjuntos aparece desde su definición más básica.

Los objetos se agrupan en un conjunto de vértices y las conexiones se describen mediante un conjunto de aristas.

41.2 Grafo como par de conjuntos

Un grafo suele escribirse como:

G = (V, E)

Donde V es el conjunto de vértices y E es el conjunto de aristas.

V = {A, B, C, D}
E = {{A, B}, {A, C}, {C, D}}

41.3 Vértices como elementos

Cada vértice es un elemento del conjunto V. Si una ciudad forma parte de una red de rutas, puede representarse como un vértice.

Córdoba ∈ V
Mendoza ∈ V

La pertenencia permite saber si un objeto pertenece al grafo.

41.4 Aristas como pares

Una arista conecta dos vértices. En un grafo no dirigido, una arista puede representarse como un conjunto de dos elementos.

{A, B} ∈ E

Esto indica que existe una conexión entre A y B, sin importar el sentido.

41.5 Grafos dirigidos y pares ordenados

En un grafo dirigido, las aristas tienen orientación. Por eso se representan mediante pares ordenados.

E = {(A, B), (B, C), (C, A)}

La arista (A, B) no significa lo mismo que (B, A).

41.6 Aristas como subconjunto del producto cartesiano

En un grafo dirigido, el conjunto de aristas es un subconjunto del producto cartesiano de vértices consigo mismo.

E ⊆ V × V

Cada arista dirigida es un par ordenado formado por dos vértices.

41.7 Relación entre teoría de conjuntos y grafos

Un grafo dirigido puede verse como una relación definida sobre un conjunto de vértices.

R ⊆ V × V

Si (A, B) ∈ R, entonces hay una conexión dirigida desde A hacia B.

41.8 Vecindad de un vértice

La vecindad de un vértice es el conjunto de vértices conectados con él.

N(A) = {B, C}

Esto indica que B y C son vecinos de A.

41.9 Grado de un vértice

El grado de un vértice en un grafo no dirigido es la cantidad de aristas incidentes en él. También puede verse como la cardinalidad de su vecindad cuando no hay lazos ni aristas múltiples.

grado(A) = |N(A)|

Si N(A) = {B, C, D}, entonces grado(A) = 3.

41.10 Caminos como secuencias de vértices

Un camino es una sucesión de vértices donde cada par consecutivo está conectado por una arista.

A → B → D → E

Para validar un camino se verifica que cada conexión pertenezca al conjunto de aristas.

41.11 Ciclos

Un ciclo es un camino que comienza y termina en el mismo vértice, sin repetir vértices intermedios en su forma simple.

A → B → C → A

Los ciclos son importantes para analizar dependencias, rutas cerradas y estructuras recurrentes.

41.12 Conectividad

Un grafo es conexo si para cualquier par de vértices existe al menos un camino que los une.

∀a, b ∈ V, existe un camino de a hacia b

La conectividad puede estudiarse usando conjuntos de vértices alcanzables.

41.13 Componentes conexas

Una componente conexa es un subconjunto maximal de vértices donde todos están conectados entre sí mediante caminos.

V = {A, B, C, D, E}
Componentes: {A, B, C}, {D, E}

Las componentes separan el grafo en regiones independientes.

41.14 Subgrafos

Un subgrafo se forma tomando subconjuntos de vértices y aristas de un grafo original.

V' ⊆ V
E' ⊆ E

Los subgrafos permiten estudiar partes específicas de una red.

41.15 Unión e intersección de grafos

Si dos grafos comparten el mismo tipo de elementos, se pueden combinar mediante operaciones de conjuntos.

Operación Vértices Aristas
Unión V₁ ∪ V₂ E₁ ∪ E₂
Intersección V₁ ∩ V₂ E₁ ∩ E₂
Diferencia V₁ - V₂ E₁ - E₂

41.16 Representación con listas de adyacencia

Una forma común de representar grafos en programación es asociar cada vértice con el conjunto de sus vecinos.

A: {B, C}
B: {A, D}
C: {A}
D: {B}

Esta representación es eficiente para consultar vecindades y recorrer conexiones.

41.17 Grafo en JavaScript

En JavaScript se puede representar una lista de adyacencia usando Map y Set.

const grafo = new Map([
  ["A", new Set(["B", "C"])],
  ["B", new Set(["A", "D"])],
  ["C", new Set(["A"])],
  ["D", new Set(["B"])]
]);

console.log(grafo.get("A")); // Set { "B", "C" }

Cada clave del mapa representa un vértice, y cada conjunto almacena sus vecinos.

41.18 Verificar una arista con JavaScript

Para saber si existe una conexión entre dos vértices, se consulta la pertenencia dentro del conjunto de vecinos.

const grafo = new Map([
  ["A", new Set(["B", "C"])],
  ["B", new Set(["A", "D"])],
  ["C", new Set(["A"])],
  ["D", new Set(["B"])]
]);

function existeArista(grafo, origen, destino) {
  return grafo.has(origen) && grafo.get(origen).has(destino);
}

console.log(existeArista(grafo, "A", "C")); // true
console.log(existeArista(grafo, "C", "D")); // false

La operación central es una pregunta de pertenencia: destino ∈ N(origen).

41.19 Aplicaciones prácticas

Los grafos aparecen en muchos problemas reales donde existen entidades conectadas.

  • Redes sociales: personas y vínculos.
  • Mapas: ciudades y rutas.
  • Sistemas web: páginas y enlaces.
  • Compiladores: dependencias entre módulos.
  • Bases de datos: relaciones entre entidades.
  • Inteligencia artificial: estados y transiciones.

41.20 Conclusión

La teoría de grafos se apoya directamente en la teoría de conjuntos. Un grafo se define mediante conjuntos de vértices y aristas, y sus propiedades se estudian con pertenencia, subconjuntos, relaciones, producto cartesiano, cardinalidad y operaciones entre conjuntos.

Comprender esta base permite modelar redes, rutas, dependencias y conexiones con mayor precisión.