minimum spanning tree tutorial
Este tutorial de C ++ explica qué es un árbol de expansión mínimo (MST) junto con los algoritmos de Prim y Kruskal para encontrar MST en un gráfico y sus aplicaciones:
Un árbol de expansión se puede definir como un subconjunto de un gráfico, que consta de todos los vértices que cubren los bordes mínimos posibles y no tiene un ciclo. El árbol de expansión no se puede desconectar.
Cada gráfico conectado y no dirigido tiene al menos un árbol de expansión. Un gráfico desconectado no tiene un árbol de expansión ya que no es posible incluir todos los vértices.
=> Consulte aquí para explorar la lista completa de tutoriales de C ++.
Lo que vas a aprender:
Árbol de expansión en C ++
Considere la siguiente gráfica conectada.
Como se muestra arriba, para el gráfico conectado que contiene 3 vértices, tenemos tres árboles de expansión. En general, si N es el número de nodos en un gráfico, entonces un gráfico conectado completo tiene un máximo de NN-2número de árboles de expansión. Así, en el gráfico anterior N = 3, por lo tanto, tiene 3(3-2)= 3 árboles de expansión.
Algunas de las propiedades del árbol de expansión se enumeran a continuación:
- Un gráfico conectado puede tener más de un árbol de expansión.
- Todos los árboles de expansión en un gráfico tienen el mismo número de nodos y aristas.
- Si eliminamos un borde del árbol de expansión, se convertirá en mínimamente conectado y hará que el gráfico se desconecte.
- Por otro lado, agregar un borde al árbol de expansión lo hará máximamente acíclico creando así un bucle.
- Un árbol de expansión no tiene un bucle ni un ciclo.
¿Qué es un árbol de expansión mínimo (MST)?
Un árbol de expansión mínimo es el que contiene el menor peso entre todos los demás árboles de expansión de un gráfico ponderado conectado. Puede haber más de un árbol de expansión mínimo para un gráfico.
Hay dos algoritmos más populares que se utilizan para encontrar el árbol de expansión mínimo en un gráfico.
Incluyen:
- Algoritmo de Kruskal
- El algoritmo de Prim
¡Analicemos ambos algoritmos!
Algoritmo de Kruskal
El algoritmo de Kruskal es un algoritmo para encontrar el MST en un gráfico conectado.
El algoritmo de Kruskal encuentra un subconjunto de un gráfico G tal que:
- Forma un árbol con todos los vértices.
- La suma de los pesos es el mínimo entre todos los árboles de expansión que se pueden formar a partir de este gráfico.
La secuencia de pasos para el algoritmo de Kruskal se da de la siguiente manera:
- Primero clasifique todos los bordes desde el peso más bajo al más alto.
- Tome el borde con el peso más bajo y agréguelo al árbol de expansión. Si se crea el ciclo, deseche el borde.
- Siga agregando aristas como en el paso 1 hasta que se consideren todos los vértices.
Pseudocódigo para el algoritmo de Kruskal
A continuación se muestra el pseudocódigo del algoritmo de Kruskal
Ahora veamos la ilustración del algoritmo de Kruskal.
Ahora elegimos el borde con el menor peso que es 2-4.
A continuación, elija el siguiente borde más corto 2-3.
Luego elegimos el siguiente borde con el borde más corto y eso no crea un ciclo, es decir, 0-3
lista de proveedores de correo electrónico gratuitos en EE. UU.
El siguiente paso es elegir el borde más corto para que no forme un ciclo. Este es 0-1.
Como podemos ver, hemos cubierto todos los vértices y aquí tenemos un árbol de expansión con un costo mínimo.
A continuación, implementaremos el algoritmo de Kruskal usando C ++.
|_+_|Producción:
El árbol de expansión mínimo (MST) según el algoritmo de Kruskal:
Borde: Peso
2 – 4 : 1
2 – 3 : 2
0 – 1 : 3
0 – 3 : 3
Tenga en cuenta que hemos utilizado el mismo gráfico de ejemplo en el programa que hemos utilizado en la ilustración del algoritmo de Kruskal anterior. En esta implementación hacemos uso de dos vectores; uno para almacenar el gráfico y otro para almacenar el árbol de expansión mínimo. Buscamos de forma recursiva las aristas con el menor peso y las añadimos al vector MST hasta cubrir todos los vértices.
Algoritmo de Prim
El algoritmo de Prim es otro algoritmo más para encontrar el mínimo que abarca el árbol de un gráfico. En contraste con el algoritmo de Kruskal que comienza con los bordes del gráfico, el algoritmo de Prim comienza con un vértice. Comenzamos con un vértice y seguimos agregando aristas con el menor peso hasta cubrir todos los vértices.
La secuencia de pasos para el algoritmo de Prim es la siguiente:
- Elija un vértice aleatorio como vértice inicial e inicialice un árbol de expansión mínimo.
- Encuentra las aristas que se conectan a otros vértices. Encuentre el borde con el peso mínimo y agréguelo al árbol de expansión.
- Repita el paso 2 hasta obtener el árbol de expansión.
Pseudocódigo para el algoritmo de Prim
Ahora veamos una ilustración del algoritmo de Prim.
Para ello, usamos el mismo gráfico de ejemplo que usamos en la Ilustración del algoritmo de Kruskal.
Seleccionemos el nodo 2 como vértice aleatorio.
A continuación, seleccionamos el borde con el menor peso de 2. Elegimos el borde 2-4.
A continuación, elegimos otro vértice que aún no está en el árbol de expansión. Elegimos el borde 2-3.
Ahora seleccionemos una arista con el menor peso de los vértices anteriores. Tenemos la ventaja 3-0 que tiene el menor peso.
A continuación, elegimos una arista con el menor peso desde el vértice 0. Esta es la arista 0-1.
En la figura anterior, vemos que ahora hemos cubierto todos los vértices del gráfico y obtenido un árbol de expansión completo con un costo mínimo.
Ahora implementemos el algoritmo de Prim en C ++.
Tenga en cuenta que en este programa también, hemos utilizado el gráfico de ejemplo anterior como entrada para que podamos comparar la salida proporcionada por el programa junto con la ilustración.
El programa se da a continuación:
|_+_|Producción:
El árbol de expansión mínimo según el algoritmo de Prim:
Borde: Peso
0 – 1 : 3
0 – 3 : 3
3 – 2 : 2
2 – 4 : 1
Aplicaciones del árbol de expansión
Algunas de las aplicaciones de los árboles de expansión mínimos son las siguientes:
# 1) Configuración de la red de comunicaciones: Cuando queremos configurar una red de comunicación utilizando enlaces de comunicación, el costo de establecer enlaces de comunicación entre dos puntos se determina mejor utilizando un MST.
# 2) Análisis de conglomerados: Se puede usar para resolver el problema de la agrupación K encontrando un árbol de expansión mínimo y eliminando las aristas k-1 más caras.
# 3) Diseño de redes de carreteras / ferrocarriles: Cuando instalamos varias redes de carreteras o ferrocarriles entre ciudades o dentro de ellas, el costo del proyecto es un factor muy importante. Podemos encontrar la mejor ruta con un costo mínimo utilizando árboles de expansión mínimos.
# 4) Planificación de instalaciones de vivienda: Las instalaciones como electricidad, agua, alcantarillado, etc. que se proporcionarán a varias casas también deben tener un costo óptimo y esto se hace mediante un MST.
# 5) Resolviendo el problema del vendedor ambulante: Podemos utilizar un MST para resolver el problema del viajante que requiere visitar cada punto al menos una vez.
Conclusión
El árbol de expansión mínimo es el subconjunto del gráfico gy este subconjunto tiene todos los vértices del gráfico y el costo total de los bordes que conectan los vértices es mínimo.
Discutimos dos algoritmos, es decir, el de Kruskal y el de Prim, para encontrar el árbol de expansión mínimo del gráfico. Las aplicaciones del árbol de expansión también se explicaron aquí en este tutorial.
=> Vea los mejores tutoriales de capacitación de C ++ aquí.
Lectura recomendada
- Tutorial de reflexión de Java con ejemplos
- Estructura de datos de árbol B y árbol B + en C ++
- Tutorial de Python DateTime con ejemplos
- Tutorial de Bugzilla: Tutorial práctico de la herramienta de gestión de defectos
- Estructura de datos de árbol binario en C ++
- Más de 20 tutoriales de MongoDB para principiantes: curso gratuito de MongoDB
- Tutorial de fragmentación de MongoDB con ejemplo
- Tutorial de creación de base de datos de MongoDB