17. Componentes conexas

Una componente conexa es un grupo maximal de vértices que pueden alcanzarse entre sí. Las componentes dividen un grafo desconectado en regiones independientes.

17.1 Introducción

Cuando un grafo no es conexo, sus vértices quedan separados en grupos. Dentro de cada grupo existen caminos entre todos sus integrantes, pero no hay caminos hacia los vértices de otros grupos.

Estos grupos reciben el nombre de componentes conexas. Identificarlas permite dividir un problema grande en subproblemas independientes.

17.2 Definición

Una componente conexa es un subgrafo conexo maximal. La palabra maximal significa que no podemos agregarle otro vértice del grafo sin perder la conectividad.

Componente = conjunto maximal de vértices conectados entre sí

Cada vértice pertenece exactamente a una componente conexa.

17.3 Relación de equivalencia

Podemos relacionar dos vértices cuando existe un camino entre ellos. Esta relación es reflexiva, simétrica y transitiva, por lo que divide el conjunto de vértices en clases de equivalencia.

PropiedadInterpretación
ReflexivaTodo vértice se alcanza a sí mismo
SimétricaSi u alcanza a v, v alcanza a u
TransitivaSi u alcanza a v y v a w, u alcanza a w

17.4 Cantidad de componentes

Un grafo conexo tiene una única componente. Un grafo sin aristas posee tantas componentes como vértices, porque cada nodo aislado forma una componente de tamaño uno.

1 ≤ cantidad de componentes ≤ |V|

Agregar una arista entre componentes diferentes las fusiona. Eliminar un puente puede separar una componente en dos o más.

17.5 Simulación interactiva: fusiona componentes

Cada color representa una componente. Selecciona dos vértices para agregar o quitar una arista y observa cómo se fusionan o separan los grupos.

Componentes detectadas

Hay 3 componentes conexas.
Componentes3
Mayor tamaño4
Vértices aislados1
EstadoDesconectado

Conecta un vértice de un color con otro de un color diferente: ambas componentes se convierten inmediatamente en una sola.

17.6 Encontrar una componente

Una búsqueda DFS o BFS iniciada en un vértice visita exactamente todos los nodos de su componente.

componente(origen) = conjunto de vértices visitados desde origen

No se alcanzarán otras componentes porque no existe ninguna arista que cruce entre ellas.

17.7 Encontrar todas las componentes

Para descubrirlas todas, recorremos los vértices. Cada vez que encontramos uno no visitado, iniciamos una nueva búsqueda y obtenemos otra componente.

  1. Crear un conjunto global de visitados.
  2. Elegir un vértice todavía no visitado.
  3. Ejecutar DFS o BFS desde él.
  4. Guardar los vértices encontrados como una componente.
  5. Repetir hasta visitar todo el grafo.

17.8 Componentes triviales

Un vértice aislado forma por sí solo una componente conexa. Se denomina componente trivial porque contiene un único vértice y ninguna arista.

grado(v) = 0 ⇒ {v} es una componente de tamaño 1

En la simulación, H comienza aislado y aparece como una componente independiente.

17.9 Componentes en grafos dirigidos

En dígrafos distinguimos componentes débilmente conexas y componentes fuertemente conexas. Las primeras ignoran la orientación; las segundas exigen caminos dirigidos en ambos sentidos.

TipoCondición
Débilmente conexaConexa al ignorar las direcciones
Fuertemente conexaCada par se alcanza en ambos sentidos

17.10 Implementación con DFS

function componentesConexas(grafo) {
  const visitados = new Set();
  const componentes = [];

  function dfs(vertice, componente) {
    visitados.add(vertice);
    componente.push(vertice);
    for (const vecino of grafo[vertice]) {
      if (!visitados.has(vecino)) dfs(vecino, componente);
    }
  }

  for (const vertice of Object.keys(grafo)) {
    if (!visitados.has(vertice)) {
      const componente = [];
      dfs(vertice, componente);
      componentes.push(componente);
    }
  }
  return componentes;
}

17.11 Complejidad y aplicaciones

Con listas de adyacencia, encontrar todas las componentes cuesta O(|V| + |E|): cada vértice y cada arista se procesa una cantidad constante de veces.

AplicaciónInterpretación de las componentes
Red socialComunidades sin vínculos externos
Red informáticaEquipos que pueden comunicarse
Procesamiento de imágenesRegiones de píxeles conectados
MapasGrupos de lugares con rutas internas

17.12 Errores comunes

  • Olvidar que un vértice aislado es una componente.
  • Iniciar una sola búsqueda y asumir que cubre un grafo desconectado.
  • No compartir el conjunto de visitados entre búsquedas.
  • Confundir componente maximal con cualquier subgrafo conexo.
  • Contar aristas en lugar de grupos de vértices.
  • Aplicar componentes no dirigidas directamente a un dígrafo.

17.13 Qué debes recordar de este tema

  • Una componente conexa es un subgrafo conexo maximal.
  • Cada vértice pertenece exactamente a una componente.
  • Un grafo conexo tiene una sola componente.
  • Un vértice aislado forma una componente trivial.
  • DFS o BFS permiten encontrar una componente.
  • Todas las componentes se calculan en O(V + E).

17.14 Conclusión

Las componentes conexas dividen un grafo en sus regiones independientes. Esta partición facilita analizar redes desconectadas y procesar cada grupo por separado.

En el próximo tema estudiaremos árboles y bosques, estructuras acíclicas estrechamente relacionadas con la conectividad.