¿Cuál es el algoritmo de fuerza bruta O (n!) Para calcular las rutas más largas?

Supongamos que lo que estamos buscando es el camino simple más largo; en otras palabras, ningún vértice aparece dos veces. Cualquiera que sea el camino más largo, se puede escribir como la secuencia de vértices que visita el camino, y los vértices consecutivos en el camino tendrán un borde entre ellos. En otras palabras, es suficiente generar cada permutación de hasta vértices [matemáticos] n [/ matemáticos], verificar que la permutación sea un camino válido verificando vértices consecutivos, calculando la longitud del camino y manteniendo el más largo encontrado hasta ahora.

Claramente, podemos hacer algunos accesos directos, por ejemplo, podemos generar todas las permutaciones de longitud exactamente [matemáticas] n [/ matemáticas], medir hasta el primer borde faltante y podemos saltar las permutaciones más allá de ese borde faltante, pero en general habrá be [math] O (n!) [/ ​​math] permutaciones para verificar.

Más o menos exactamente el tipo de algoritmo de fuerza bruta que esperaría … y, en ausencia de información adicional o restricciones sobre el gráfico, también esperaría no poder hacerlo significativamente mejor: el problema es NP-hard, esencialmente porque la única forma de verificar una ruta más larga es verificarlas todas.

  • Soy consciente de un algoritmo de programación dinámica paramétrica que funciona en ~ [math] O (n!) [/ ​​Math] time. El algoritmo es básicamente un DFS que enumera todas las rutas de un gráfico. Asegura que [math] \ forall p [/ math] enumerated [math] \ en G = (V, E) [/ math] no se eligen ciclos insertando en una pila en cada nivel Y evitando los bordes traseros. Literalmente, una vez que se enumeran todas las rutas simples, se eligen las rutas más largas [matemáticas] \ forall (u, v) \ en V [/ matemáticas]. Tenga en cuenta que cada vez que tocamos un Back-Edge, verificamos si la distancia ha aumentado. Como estamos enumerando todas las rutas en el gráfico desde un vértice inicial [matemática] s \ en V [/ matemática], el peor de los casos es [matemática] \ prod_ {i = 1} ^ {n – 1} i = (n – 1)! [/ Math] caminos. Aquí está la explicación de Wikipedia de lo mismo: el problema del camino más largo (Complejidad Parametrizada)
  • Otra forma inteligente es utilizar una reducción del problema de rutas simples más cortas de la siguiente manera: [matemática] \ forall e \ en E, w (e) = -1 (w (e)) [/ math]. Ahora, ejecute el algoritmo SSPP y eso le dará las rutas simples más largas en un gráfico.

More Interesting

¿Es posible "escribir un programa o algoritmo" para encontrar la complejidad de tiempo de cualquier programa dado como entrada?

¿Cómo se puede hacer un sistema como Google AdWords y AdSense?

¿Cuáles son las diferencias entre Algorithmia y Amazon Lambda?

Cómo obtener el número de coprimos de n bajo n

1,000 participantes toman un examen que consta de 100 preguntas y 5 opciones por pregunta. ¿Cuál es el mejor enfoque (algoritmo) para encontrar todos los pares posibles de participantes con al menos un 80% de coincidencia en las opciones que eligieron?

¿Es posible verificar si un gráfico está conectado o no si sé el grado de cada vértice?

¿Cómo se resuelve The Great Ball (SPOJ - BYTESE2)? ¿A dónde voy mal?

¿El problema de las reinas N tiene al menos una solución por cada N> 3?

¿Hay algún libro para la recursividad?

Cómo hacer búsquedas difusas eficientes usando la distancia levenshtein

¿Obtendría algún beneficio resolviendo los problemas del Proyecto Euler por la fuerza bruta?

¿Qué es un algoritmo para programar un torneo para que termine en el menor tiempo posible, dado un torneo round robin (donde cada jugador juega entre sí) entre n jugadores (n es par) que puede representarse con un gráfico completo?

¿Son los algoritmos iguales para todos los lenguajes de programación?

¿Cuál es el mejor factor de contracción para un tipo de peine? ¿Por qué?

¿Cómo demostramos que un gráfico conectado con n nodos y más de n-1 aristas debe contener ciclo?