Consideremos las versiones más simples de estos problemas donde los bordes no están ponderados.
Dado un gráfico G, comprobar si sol Tiene un ciclo.
Dado un gráfico sol y un numero k, comprobar si sol tiene un ciclo de longitud al menos k.
El primero es fácil y se puede resolver con DFS. El segundo es NP-hard.
Veamos un problema aún más simple:
Dado un gráfico sol y dos vértices s y t, verifique si hay una ruta simple desde s a t en sol.
Dado un gráfico sol y dos vértices s y t y un numero k, verifique si hay una ruta simple desde s a t en sol de longitud al menos k.
Todos estos problemas son del mismo sabor. El superior es fácil, mientras que el inferior es NP-duro. Explicaré la diferencia para el último porque es más simple pero la misma explicación se aplica a los otros pares.
La razón por la cual las superiores son fáciles mientras que las inferiores no lo son es el resultado de la estructura de las respuestas a estos problemas.
Primero veamos el problema de encontrar un camino simple e intentemos resolverlo recursivamente. Si solo intentamos resolver este problema directamente, necesitaríamos hacer un seguimiento de los vértices que hemos usado hasta ahora:
Si m p l e Path(s,t,G):= hay un camino desde s a t en G.
SimplePath(s,t,G) iff
s=t o para algunos u∈G SimplePath(s,u,G−t) y ut∈G.
Si intentamos resolver el problema con este ingenuo algoritmo recursivo, llevará tiempo exponencial: ¡
existen exponencialmente muchas posibilidades para el conjunto de vértices no utilizados!
Tenemos que ser más inteligentes.
¿Por qué obtuvimos exponencialmente muchas posibilidades? Debido a que estábamos tratando de encontrar un camino simple y hacer cumplir esta condición, necesitábamos hacer un seguimiento de los vértices no utilizados.
Bien, dejemos esa condición y veamos dónde podemos obtener:
Considere el problema de encontrar un camino (no necesariamente simple) de s a t. Dado que el camino no necesita ser simple, no necesitamos hacer un seguimiento de los vértices no utilizados. En otras palabras, el gráfico no cambia con el tiempo.
PathG(s,t):= hay un camino desde s a t.
PathG(s,t) iff
s=to
para algunosu∈G PathG(s,t) y ut∈G.
Pero aún no hemos terminado. El problema es que no sabemos siPathG(s,u)
es un problema menor que PathG(s,t). Entonces, esta solución recursiva podría terminar en un bucle y nunca terminar.
Para evitar esto, podemos agregar un parámetro adicional que asegure que el problema se reduzca: el número de bordes en la ruta.
PathG(s,t,k):= hay un camino desde s a t con a lo sumo k bordes
PathG(s,t,k) iff
k=0 y s=t o
k>0 y para algunos u∈G PathG(s,u,k−1) y ut∈G.
Ahora tenga en cuenta que hay un camino simple desde s a t si hay un camino desde s a t con a lo sumo nbordes En otras palabras:
SimplePath(s,t,G) iff PathG(s,t,n).
Los puntos esenciales aquí son:
Cada camino simple (no trivial) desde s a t
consiste en un camino simple desde s a algún vértice u y una ventaja ut.
Podemos suponer que t no aparece en la ruta simple desde s a u.
No necesitamos mantener explícitamente la lista de vértices no utilizados.
Estas propiedades nos permiten tener una recursión inteligente
por la existencia de un problema de ruta simple.
Ahora, esto no se aplica al problema de encontrar una ruta de longitud al menos k. No sabemos cómo reducir el problema de encontrar una ruta simple de longitud al menosk
a un subproblema más pequeño sin mantener la lista de vértices no utilizados. Esas propiedades nos permiten resolver la existencia del problema del camino de manera eficiente.
Cuando un gráfico no tiene un ciclo negativo, nos permiten resolver la existencia de una ruta de longitud como máximo k problema y la ruta más corta problemas simples de manera eficiente.
Sin embargo, no sostienen la existencia de un camino de longitud al menos k. Considere una gráfica con3 vértices s,u,t.
w(su)=1000,w(st)=1000,w(ut)=10,w(tu)=10. El camino de longitud al menos1001 desde s a t contiene u y el camino de longitud al menos 1001 desde s a u contiene t. Por lo tanto, no podemos reducir una instancia del problema a una instancia más pequeña del problema sin dar explícitamente la lista de vértices no utilizados.
En otras palabras, no conocemos una recursión inteligente para la existencia de un camino simple de longitud al menos k problema mientras conocemos una recursión inteligente para la existencia de un camino simple.
Volviendo a la última parte de su pregunta, hay un problema con su argumento.
De hecho, es cierto que la existencia de un ciclo de longitud >k
se puede resolver en tiempo polinómico para cualquier fijo k (es decir kno es parte de la entrada). (Similar a cómo se puede verificar si un gráfico no ponderado tiene un ciclo de longitudk
a tiempo O(nk).)
sin embargo cuando k es parte de la entrada, esto ya no se mantiene ya que el tiempo de ejecución depende de k mal.