Considérons les versions plus simples de ces problèmes où les arêtes ne sont pas pondérées.
Étant donné un graphique g, vérifier si g a un cycle.
Étant donné un graphique g et un certain nombre k, vérifier si g a un cycle de longueur au moins k.
Le premier est facile et peut être résolu en utilisant DFS. Le second est NP-dur.
Regardons un problème encore plus simple:
Étant donné un graphique g et deux sommets s et t, vérifiez s'il existe un chemin simple à partir de s à t dans g.
Étant donné un graphique g et deux sommets s et t et un certain nombre k, vérifiez s'il existe un chemin simple à partir de s à t dans g de longueur au moins k.
Tous ces problèmes ont la même saveur. Celui du haut est facile tandis que celui du bas est dur NP. Je vais expliquer la différence pour le dernier car c'est plus simple mais la même explication s'applique aux autres paires.
La raison pour laquelle ceux du haut sont faciles alors que ceux du bas ne le sont pas est le résultat de la structure des réponses à ces problèmes.
Examinons d'abord le problème de la recherche d'un chemin simple et essayons de le résoudre récursivement. Si nous essayons simplement de résoudre ce problème directement, nous aurions besoin de garder une trace des sommets que nous avons utilisés jusqu'à présent:
Sje m p l e Pa t h ( s , t , G ) : = il y a un chemin de s à t dans g.
Sje m p l e Pa t h ( s , t , G ) ssi
s = t ou pour certains u ∈ G Sje m p l e Pa t h ( s , u , G - t ) et u t ∈ G.
Si nous essayons de résoudre le problème avec cet algorithme récursif naïf, cela prendra du temps exponentiel:
il y a exponentiellement de nombreuses possibilités pour l'ensemble des sommets inutilisés!
Nous devons être plus intelligents.
Pourquoi avons-nous obtenu de façon exponentielle de nombreuses possibilités? Parce que nous essayions de trouver un chemin simple et d'appliquer cette condition, nous devions garder une trace des sommets inutilisés.
OK, alors abandonnons cette condition et voyons où nous pouvons obtenir:
Considérez le problème de trouver un chemin (pas nécessairement simple) à partir de s à t. Puisque le chemin n'a pas besoin d'être simple, nous n'avons pas besoin de garder une trace des sommets inutilisés. En d'autres termes, le graphique ne change pas avec le temps.
Pun thg( s , t ) : = il y a un chemin de s à t.
Pun thg( s , t ) ssi
s = tou
pour certainsu ∈ G Pun thg( s , t ) et u t ∈ G.
Mais nous n'avons pas encore fini. Le problème est que nous ne savons pas siPun thg( s , u )
est un problème plus petit que Pun thg( s , t ). Cette solution récursive peut donc se terminer en boucle et ne jamais se terminer.
Pour éviter cela, nous pouvons ajouter un paramètre supplémentaire qui s'assure que le problème diminue: le nombre d'arêtes dans le chemin.
Pun thg( s , t , k ) : = il y a un chemin de s à t avec au plus k bords.
Pun thg( s , t , k ) ssi
k = 0 et s = t ou
k > 0 et pour certains u ∈ G Pun thg( s , u , k - 1 ) et u t ∈ G.
Notez maintenant qu'il existe un chemin simple de s à t ssi il y a un chemin de s à t avec au plus nbords. En d'autres termes:
Sje m p l e Pa t h ( s , t , G ) ssi Pun thg( s , t , n ).
Les points essentiels ici sont:
Chaque chemin simple (non trivial) de s à t
consiste en un chemin simple de s à un sommet u et un bord u t.
On peut supposer que t n'apparaît pas dans le chemin simple de s à u.
Nous n'avons pas besoin de conserver explicitement la liste des sommets inutilisés.
Ces propriétés nous permettent d'avoir une récursivité intelligente
pour l'existence d'un problème de chemin simple.
Maintenant, ceux-ci ne s'appliquent pas au problème de trouver un chemin de longueur au moins k. Nous ne savons pas comment réduire au moins le problème de trouver un chemin simple de longueurk
à un sous-problème plus petit sans conserver la liste des sommets inutilisés. Ces propriétés nous permettent de résoudre efficacement l'existence d'un problème de chemin.
Lorsqu'un graphe n'a pas de cycle négatif, il nous permet de résoudre l'existence d'un chemin de longueur au plus k problème et les problèmes de chemin simple les plus courts efficacement.
Cependant, ils ne tiennent pas à l'existence d'un chemin de longueur au moins k. Considérons un graphique avec3 sommets s , u , t.
w ( s u ) = 1000 , w ( s t ) = 1000 , w ( u t ) = 10 , w ( t u ) = 10. Le chemin de la longueur au moins1001 de s à t contient u et le chemin de longueur au moins 1001 de s à u contient t. Nous ne pouvons donc pas réduire une instance du problème à une instance plus petite du problème sans donner explicitement la liste des sommets inutilisés.
En d'autres termes, nous ne connaissons pas de récursivité intelligente pour l'existence d'un chemin simple de longueur au moins k problème alors que nous connaissons une récursivité intelligente pour l'existence d'un chemin simple.
Pour revenir à la dernière partie de votre question, il y a un problème avec votre argument.
Il est en effet vrai que l'existence d'un cycle de longueur > k
peut être résolu en temps polynomial pour tout fixe k (c'est à dire kne fait pas partie de l'entrée). (Similaire à la façon dont on peut vérifier si un graphique non pondéré a un cycle de longueurk
à l'heure O (nk).)
Cependant quand k fait partie de l'entrée cela ne tient plus puisque le temps de fonctionnement dépend de k dans le mauvais sens.