web-dev-qa-db-fra.com

Algorithme pour trouver un chemin Hamilton dans un DAG

Je fais référence au livre de Skienna sur les algorithmes.

Le problème de tester si un graphe G contient un Hamiltonian path Est NP-hard, Où un chemin hamiltonien P est un chemin qui visite chaque sommet exactement une fois. Il n'est pas nécessaire qu'il y ait un bord en G du sommet final au sommet initial de P, contrairement au problème du cycle hamiltonien.

Étant donné un graphe acyclique dirigé G (DAG), donnez un algorithme temporel O(n + m) pour tester s'il contient ou non un chemin hamiltonien.

Mon approche,

Je prévois d'utiliser DFS et Topological sorting. Mais je ne savais pas comment relier les deux concepts pour résoudre le problème. Comment utiliser un tri topologique pour déterminer la solution.

Aucune suggestion?

27
user2302617

Vous pouvez d'abord trier topologiquement le DAG (chaque DAG peut être trié topologiquement) en O (n + m).

Une fois cela fait, vous savez que Edge passe des sommets d'index inférieurs aux sommets supérieurs. Cela signifie qu'il existe un chemin hamiltonien si et seulement s'il y a Edge entre des sommets consécutifs, par ex.

(1,2), (2,3), ..., (n-1,n).

(C'est parce que dans un chemin hamiltonien, vous ne pouvez pas "revenir en arrière" et pourtant vous devez tout visiter, donc la seule façon est de "ne pas sauter")

Vous pouvez vérifier cette condition dans O (n).

Ainsi, la complexité globale est O (m + n).

44
Petar Ivanov

Je ne pense pas que la déclaration de @agassaa soit tout à fait correcte. Prenons l'exemple simple où il y a trois nœuds "A", "B", "C" et les arêtes A-> B, B-> C, A-> C. Alors que A a deux enfants et C a deux parents, A-> B-> C forme un chemin hamiltonien. Vous n'avez pas besoin de parcourir chaque bord du graphique pour que le chemin soit hamiltonien.

n DAG qui a un cycle hamiltonien

1
kakadong