Un árbol generador conserva todos los vértices de un grafo conectado, elimina ciclos y utiliza únicamente las aristas necesarias para mantener la conectividad.
Un grafo conectado puede contener múltiples rutas redundantes y numerosos ciclos. Si queremos conservar la comunicación entre todos los vértices utilizando menos conexiones, podemos seleccionar un subconjunto de aristas.
Cuando ese subconjunto conecta todos los nodos y no contiene ciclos, forma un árbol generador, también llamado árbol de expansión.
Un árbol generador T de un grafo conectado G es un subgrafo que contiene todos los vértices de G y es un árbol.
No se crean conexiones nuevas: solo se eligen algunas aristas del grafo original.
Todo grafo no dirigido y conectado posee al menos un árbol generador. Si el grafo ya es un árbol, su único árbol generador es el propio grafo.
Un grafo desconectado no puede tener un árbol que incluya todos sus vértices, aunque sí puede tener un bosque generador.
Pulsa cerca de una arista para seleccionarla o descartarla. Debes conectar los siete vértices sin formar ciclos y usando exactamente seis conexiones.
Los dos botones de ejemplo producen árboles distintos sobre los mismos vértices. Esto muestra que un grafo puede tener múltiples árboles generadores.
Una forma de obtener un árbol generador consiste en comenzar con el grafo completo y eliminar una arista de cada ciclo sin desconectarlo.
El proceso termina cuando quedan n − 1 aristas.
También podemos comenzar sin aristas y agregarlas una por una, siempre que conecten partes diferentes y no formen ciclos.
Esta idea aparece en el algoritmo de Kruskal.
Durante DFS o BFS, cada vértice nuevo se descubre mediante una arista. El conjunto de esas aristas de descubrimiento forma un árbol generador.
| Búsqueda | Forma habitual del árbol | Uso |
|---|---|---|
| DFS | Ramas profundas | Exploración y retroceso |
| BFS | Niveles desde la raíz | Distancias mínimas sin pesos |
Todo árbol de expansión mínima es un árbol generador, pero un árbol generador cualquiera no considera costos.
Los árboles mínimos se estudiarán más adelante mediante los algoritmos de Prim y Kruskal.
function arbolGeneradorDFS(grafo, origen) {
const visitados = new Set([origen]);
const aristasArbol = [];
function dfs(actual) {
for (const vecino of grafo[actual]) {
if (!visitados.has(vecino)) {
visitados.add(vecino);
aristasArbol.push([actual, vecino]);
dfs(vecino);
}
}
}
dfs(origen);
return aristasArbol;
}function esArbolGenerador(vertices, aristas, estaConectado, tieneCiclo) {
return estaConectado &&
!tieneCiclo &&
aristas.length === vertices.length - 1;
}
console.log(esArbolGenerador(
["A", "B", "C", "D"],
[["A", "B"], ["B", "C"], ["C", "D"]],
true,
false
));Un árbol generador elimina conexiones redundantes sin perder ningún vértice ni la conectividad. Esta estructura sirve como esqueleto de una red y como base de numerosos algoritmos.
En el próximo tema estudiaremos el recorrido en profundidad, una de las formas fundamentales de explorar grafos y construir árboles generadores.