¿Cómo se puede probar que la ruta única a través de un árbol de expansión mínima entre dos nodos es una ruta más corta de “cuello de botella”?

La respuesta de Miguel Oliveira parece suficiente, la idea general es correcta. Pero cuando me pidió que respondiera, intentaré completar algunos detalles más.

Para una prueba más formal, necesitará la siguiente declaración sobre el algoritmo de Kruskal:

  • Deje que [math] E_i [/ ​​math] sea el primer borde [math] i [/ math] procesado por el algoritmo de Kruskal.
  • Deje [math] M_i [/ ​​math] ser el conjunto de aristas del algoritmo de Kruskal ya seleccionado como aristas MST.
  • Sea [math] G [X] [/ math] el gráfico con todos los vértices originales y [math] X [/ math] como el conjunto de aristas.

Para cada [matemática] i [/ matemática], los componentes conectados de [matemática] G [E_i] [/ matemática] son ​​los mismos que los componentes conectados de [matemática] G [M_i] [/ matemática]. Esto es obvio / fácilmente probado por inducción.

Ahora considere dos vértices [math] u [/ math] y [math] v [/ math]. Sea [math] d [/ math] la distancia del cuello de botella para [math] u [/ math] y [math] v [/ math]: es decir, la longitud de borde más pequeña de manera que podamos caminar entre [math] u [ / math] y [math] v [/ math] utilizando solo bordes de longitud [math] d [/ math] o menos.

Sea [math] i [/ math] el índice de manera que [math] E_i [/ ​​math] sea el conjunto de todos los bordes de longitud [math] d [/ math] o menos. Según la definición de [matemáticas] d [/ matemáticas] y [matemáticas] i [/ matemáticas], los vértices [matemáticas] u [/ matemáticas] y [matemáticas] v [/ matemáticas] están en el mismo componente de [matemáticas] G [E_i] [/ matemáticas]. Por la propiedad anterior del algoritmo de Kruskal [math] u [/ math] y [math] v [/ math] también están en el mismo componente de [math] G [M_i] [/ math].

La declaración de la pregunta original sigue trivialmente: la ruta entre [math] u [/ math] y [math] v [/ math] en [math] G [M_i] [/ math] estará allí en el MST final, y esta ruta solo contiene bordes de longitud [math] d [/ math] o menos.


Aquí hay algunos comentarios adicionales sobre esta tarea:

Para resolver el problema original, en realidad no tiene que construir el MST. Solo necesita encontrar la última ventaja agregada por el algoritmo de Kruskal: o, de manera equivalente, la [matemática] i [/ matemática] más pequeña de manera que [matemática] G [E_i] [/ matemática] esté conectada.

Ambos algoritmos dados en el análisis de USACO son rápidos y están cerca de ser óptimos. En la práctica, debe elegir cualquiera de ellos. Aún así, es interesante darse cuenta de que hay una mejor solución. De hecho, la tarea se puede resolver en el tiempo óptimo [matemático] O (mn) [/ matemático], es decir, en [matemático] O (v + e) ​​[/ matemático] para un gráfico general con [matemático] v [ / math] vértices y [math] e [/ math] bordes.

El algoritmo es significativamente más complicado. Aquí hay una idea general: Queremos encontrar la [matemática] i [/ matemática] más grande de modo que el gráfico todavía esté desconectado. En cualquier momento, tendremos algunos bordes aceptados (y sabremos los componentes conectados que producen), algunos bordes rechazados (ya sabemos que son demasiado largos) y algunos bordes activos. En cada paso, encuentre la mediana de los bordes activos e intente agregar la mitad más pequeña al gráfico. Si aún nos deja con más de un componente, acepte esos bordes, de lo contrario rechace el borde activo medio y todos los bordes más largos. (Las complicaciones radican en implementar el paso en O (# de bordes activos), sin que la complejidad dependa de la cantidad de vértices. Se puede hacer pero es complicado).

Digamos que tiene un gráfico y un árbol de expansión mínimo (MST).

Supongamos que hay una ruta más corta entre algunos dos nodos, A y B, cuyo borde más grande es más pequeño que el borde más grande de la ruta entre estas dos notas dentro del MST. Llame a este borde más grande E.

Eliminar E del MST. El MST ahora sería dos árboles disjuntos.

Ahora mire la ruta entre A y B en todo el gráfico de entrada. Uno de sus bordes conectaría estas dos mitades del MST ahora roto.

Y, por definición, sería más corto que E.

Lo que significa que su MST no era realmente un MST.

Contradicción, QED.

Piensa en el algoritmo de Kruskal. Procesa aristas en orden ascendente por peso. Siempre seleccionará los pesos más pequeños para conectar los nodos, minimizando así el cuello de botella de todo el árbol de expansión (por lo tanto, entre todos los nodos).

Realmente no puedo demostrar esto formalmente, pero creo que va en esta línea:

Supongamos que hay una ruta más corta de cuello de botella entre 2 nodos, de modo que esta ruta tiene un cuello de botella que es más pequeño que el cuello de botella correspondiente en la ruta entre los 2 nodos en el MST del gráfico.

Esto es una contradicción porque el camino más corto del cuello de botella produciría un árbol de expansión más pequeño que el MST del gráfico.

Para probar esto, primero hazte una pregunta

¿Por qué Kruskal no eligió ningún otro camino que conectara dos nodos?

Es porque la forma en que funciona el algoritmo de kruskal, el camino de kruskal se habría formado primero, que todos los otros caminos posibles entre dos nodos … Y todos los otros caminos posibles entre dos nodos estaban haciendo un ciclo con este camino, por eso kruskal rechazó esos …

Ahora, debido a que estaban haciendo un ciclo con el camino kruskal, tenían un borde mayor que el borde máximo del camino kruskal ya formado porque los kruskal eligen primero los bordes mínimos.

Espero que esta intuición ayude … Gracias.

Puede discutir sobre esto utilizando el hecho de que un MST no puede tener un borde que es el borde de mayor peso en cualquier ciclo en el gráfico original (Esto es una consecuencia directa de la propiedad de corte [1] del MST). Combinado con el hecho de que si agrega cualquier borde en un MST, produce un ciclo, debería ser sencillo mostrar que cualquier camino entre 2 bordes en un MST sería un camino más corto de cuello de botella.

[1] http://en.wikipedia.org/wiki/Min

More Interesting

Sistemas distribuidos: ¿Existe un algoritmo de elección de líder para un anillo sincrónico en el que todos los procesadores menos uno tienen la misma ID?

¿Hay algún buen sitio para aprender algoritmos / conceptos de programación todos los días (similar a la pregunta SAT del día)?

¿Son las estructuras de datos y los requisitos previos de algoritmos para la arquitectura y organización de computadoras en un curso típico de CS? Estoy aprendiendo por mi cuenta, ¿cuál debería aprender primero? ¿Puedo aprenderlos en paralelo?

¿Cuál es el algoritmo generador de números aleatorios más avanzado disponible ahora?

Como desarrollador web full stack con 1 año de experiencia, ¿sería beneficioso para mí aprender algoritmo y estructura de datos?

¿Cuáles son los algoritmos necesarios para resolver todos los problemas (usando C ++) en cualquier concurso de codificación competitivo?

¿Cuál es tu algoritmo favorito y dónde lo has usado prácticamente en la vida real?

¿Cuál es la diferencia entre las estructuras de datos de programación C y las estructuras de datos de programación Java?

¿Qué es el WordNet? ¿Cuál es la relación entre WordNet y el algoritmo Leacock & Chodorow?

¿Cuál es la explicación intuitiva para agregar flujo en bordes inversos en el algoritmo de flujo máximo? ¿Por qué necesitamos eso?

¿Cuál es la comparación en algoritmo de Sieve of Sundaram y Sieve of Eratosthenes con tiempo-complejidad?

¿Cuál es el mejor curso de algoritmo para comenzar a resolver problemas y convertirse en un ingeniero de software? Encontré tres cursos. ¿Me pueden ayudar a elegir uno?

¿Cómo se debe describir y hablar sobre la recursividad cuando se hace pizarra o se programa un par?

Si una computadora toma el control total del control del tráfico aéreo, ¿cómo será el algoritmo? ¿Cómo manejará los aterrizajes de emergencia y cómo manejará una pista paralela?

Cómo construir un gráfico si se proporciona el recorrido DFS y el recorrido BFS