11. Representación mediante matrices de adyacencia

Una matriz de adyacencia representa todas las parejas posibles de vértices mediante una tabla cuadrada. Cada celda indica si existe una conexión entre su fila y su columna.

11.1 Introducción

Una lista de adyacencia almacena únicamente los vecinos existentes. Una matriz de adyacencia, en cambio, reserva una posición para cada par posible de vértices.

Esta representación utiliza una matriz cuadrada de tamaño n × n. Las filas y columnas corresponden a los mismos vértices, y el valor de cada celda informa si existe una arista o arco.

11.2 Estructura de la matriz

Si los vértices son A, B, C y D, la matriz tendrá cuatro filas y cuatro columnas.

A B C D
A [ 0, 1, 1, 0 ]
B [ 1, 0, 0, 1 ]
C [ 1, 0, 0, 0 ]
D [ 0, 1, 0, 0 ]

La celda de la fila A y columna B vale 1 porque A y B son adyacentes. La celda A,D vale 0 porque no existe esa conexión.

11.3 Significado de cada celda

Para un grafo simple, la matriz utiliza normalmente ceros y unos.

matriz[i][j] = 1 si existe una conexión de i hacia j
matriz[i][j] = 0 si no existe

En un grafo dirigido, el orden importa: la fila representa el origen y la columna representa el destino.

11.4 Matrices dirigidas y no dirigidas

PropiedadNo dirigidoDirigido
InterpretaciónLa fila y columna son extremosFila = origen, columna = destino
Simetríamatriz[i][j] = matriz[j][i]No necesariamente simétrica
Agregar A—BSe modifican A,B y B,ANo corresponde
Agregar A→BNo correspondeSolo se modifica A,B

11.5 Simulación interactiva: grafo y matriz

Pulsa dos nodos del grafo o selecciona una celda de la matriz. Ambas representaciones se actualizan al mismo tiempo. Las celdas de la diagonal permanecen en cero porque trabajamos con grafos simples sin bucles.

Matriz de adyacencia

Fila = origen · Columna = destino

Selecciona dos vértices o pulsa una celda.
TipoNo dirigido
Dimensión5 × 5
Conexiones5
Celdas con valor 110

En modo no dirigido, pulsa A,B y observa que B,A cambia también: la matriz conserva su simetría. En modo dirigido, cada celda funciona de manera independiente.

11.6 La diagonal principal

Las celdas matriz[i][i] representan conexiones de un vértice consigo mismo. En un grafo simple sin bucles, toda la diagonal principal contiene ceros.

matriz[A][A] = 0
matriz[B][B] = 0
matriz[C][C] = 0

Si el modelo admite bucles, esas posiciones pueden tener valores distintos de cero.

11.7 Crear una matriz en JavaScript

Podemos crear una matriz n × n con arreglos anidados e inicializar todas sus celdas en cero.

function crearMatriz(cantidadVertices) {
  return Array.from(
    { length: cantidadVertices },
    () => Array(cantidadVertices).fill(0)
  );
}

const matriz = crearMatriz(4);
console.log(matriz);

11.8 Agregar una arista

En un grafo no dirigido debemos actualizar dos posiciones simétricas.

const matriz = Array.from({ length: 4 }, () => Array(4).fill(0));

function agregarArista(a, b) {
  matriz[a][b] = 1;
  matriz[b][a] = 1;
}

agregarArista(0, 2);
console.log(matriz[0]);
console.log(matriz[2]);

Para un arco dirigido de a hacia b solo asignaríamos matriz[a][b] = 1.

11.9 Consultas y complejidad

Comprobar si dos vértices son adyacentes requiere consultar una única celda.

Consultar arista: O(1)
Recorrer vecinos de un vértice: O(|V|)
Espacio de almacenamiento: O(|V|²)

La consulta constante es una ventaja importante, pero el costo cuadrático de memoria puede ser excesivo para grafos grandes y dispersos.

11.10 Obtener grados desde la matriz

En un grafo no dirigido, el grado de un vértice es la suma de su fila. En un grafo dirigido, la suma de la fila produce el grado de salida y la suma de la columna, el grado de entrada.

OperaciónNo dirigidoDirigido
Suma de fila iGrado de iGrado de salida de i
Suma de columna iEl mismo gradoGrado de entrada de i

11.11 Matrices para grafos ponderados

En un grafo ponderado, la celda puede guardar el peso de la conexión en lugar de un 1.

matriz[A][B] = 7 → peso de A a B
matriz[A][C] = ∞ → no existe conexión

Debemos elegir cuidadosamente el valor que representa ausencia de arista, porque un peso cero puede ser válido.

11.12 Errores comunes

  • Intercambiar el significado de filas y columnas en grafos dirigidos.
  • Actualizar una sola celda al agregar una arista no dirigida.
  • Confundir un cero con una arista de peso cero.
  • Suponer que toda matriz de adyacencia debe ser simétrica.
  • Olvidar que la dimensión depende del número de vértices, no de aristas.
  • Usar una matriz enorme para un grafo muy disperso sin evaluar su costo.

11.13 Qué debes recordar de este tema

  • Una matriz de adyacencia tiene una fila y una columna por vértice.
  • Cada celda representa una pareja posible de vértices.
  • En grafos no dirigidos, la matriz es simétrica.
  • En grafos dirigidos, la fila representa el origen y la columna el destino.
  • Consultar una conexión cuesta O(1).
  • La matriz utiliza O(V²) posiciones de memoria.

11.14 Conclusión

La matriz de adyacencia ofrece consultas directas y una representación regular, especialmente útil para grafos densos y algoritmos matriciales. Su principal costo es reservar espacio para todas las parejas, incluso cuando muchas no están conectadas.

En el próximo tema estudiaremos las matrices de incidencia, que relacionan vértices con aristas en lugar de relacionar vértices entre sí.