¿Existe un algoritmo para encontrar un árbol con una longitud de ruta mínima ponderada para un gráfico conectado genérico?

Lo que está tratando de encontrar aquí es un MST o árbol de expansión mínimo. Supongamos que todos los nodos están en el mismo componente.

Un árbol de expansión mínimo (MST) de un gráfico es un árbol de expansión cuyo peso (la suma de los pesos de sus bordes) no es mayor que el peso de cualquier otro árbol de expansión.

Dado que estamos encontrando esto, podemos usar muchos algoritmos diferentes. De lo más simple a lo más difícil:

BFS

Podríamos usar un algoritmo BFS simple dado que todos los bordes tienen el mismo peso. Simplemente comenzamos nuestro BFS en cualquier nodo y atravesamos todos los nodos a los que está conectado en esa dirección (ya sea que no esté dirigido o dirigido). Marque los nodos visitados y continúe hasta que se atraviesen todos los nodos. Dado que este es un BFS básico, cualquier árbol de expansión es el árbol de expansión mínimo. Este BFS se ejecuta en O (V + E).

DFS

Podríamos usar un algoritmo DFS para encontrar el MST con cualquier gráfico. Al igual que un DFS normal, solo atravesamos cada ruta y retrocedemos hasta que se hayan visitado todos los nodos. El uso de un DFS recursivo o no recursivo funcionará con una pila. Este DFS también se ejecuta en O (V + E).

Algoritmo de Prim / Dijkstra

Una de las formas más comunes de encontrar un MST es usar Prim, un algoritmo que usa principios similares a los de Dijkstra. Dijkstra se usa para encontrar el camino más corto entre dos nodos. Esto no siempre será parte de un MST, pero los conceptos básicos son similares. Prim utiliza el enfoque de Dijkstra para mirar los nodos, excepto que no tiene en cuenta las longitudes de ruta anteriores. El algoritmo de Prim funciona en todos los gráficos y se ejecuta en O (V * V) sin montones u O (Vlog (V) + Elog (V)) con montones binarios.

Algoritmo de Kruskal

Otra forma común es usar el algoritmo de Kruskal. Kruskal funciona colocando todos los vértices en un árbol de nodos y colocando todos los bordes en una cola prioritaria. Luego, tomará el primer borde de la cola de prioridad (se ordena durante la inserción) y lo ignorará (si forma un ciclo) o lo extraerá (si no forma un ciclo, creando un árbol más grande). Una vez que se han agregado los bordes V-1, se encuentra el MST. Este algoritmo se ejecuta en todos los gráficos y se ejecuta en O (Elog (E)) que es igual a O (Elog (V)).

Mediante el uso de estos 4 algoritmos, podríamos encontrar el MST de cualquier gráfico dado. Para obtener más información sobre estos algoritmos, puede leer libros y conferencias sobre estructuras de datos y algoritmos. Estos irán más allá de estos algoritmos básicos y pueden profundizar en la teoría de grafos y otros.

¡Buena suerte y diviértete en todas tus empresas de CS!


Tony Li, los principios subyacentes de la ruta más corta de Dijkstra le permitirán descubrir el algoritmo de Prim que encuentra el árbol de expansión mínima. Dijkstra no necesariamente te dará el MST.

Si toma este ejemplo, el algoritmo de Dijkstra dirá que la longitud total del MST es 15. Mientras tanto, Prim nos dirá que es 7. Por lo tanto, Dijkstra no devolverá el árbol correcto de manera consistente.

Sí, este es el problema del primer camino más corto de Dijkstra. Ver el algoritmo de Dijkstra – Wikipedia