Apprentissage interactif de la théorie des graphes
Apprentissage interactif de la théorie des graphes
Guest User
Using app without sign in
Détecteur de chemins et circuits eulériens
Chemin qui visite chaque arête exactement une fois
Sélectionnez un algorithme et générez les étapes pour commencer la visualisation
Un chemin eulérien parcourt chaque arête d'un graphe exactement une fois ; un circuit eulérien le fait et revient à son point de départ. Leonhard Euler a fondé la théorie des graphes en 1736 en prouvant que les Sept Ponts de Konigsberg n'admettent aucun tel parcours.
L'existence est facile à vérifier : un graphe non orienté connexe a un circuit eulérien exactement quand tout sommet est de degré pair, et un chemin eulérien quand exactement zéro ou deux sommets sont de degré impair. L'algorithme de Hierholzer construit le parcours en O(E) : suivre des arêtes inutilisées jusqu'à revenir au départ, puis insérer de façon répétée des cycles de détour depuis les sommets ayant encore des arêtes inutilisées.
Les chemins eulériens résolvent les problèmes d'inspection de tournées comme le déneigement, le balayage des rues et la distribution du courrier, reconstruisent des séquences d'ADN à partir de k-mers en bio-informatique et génèrent des suites de De Bruijn. Le test d'existence fondé sur la parité est une question d'entretien classique qui le distingue du problème hamiltonien, bien plus difficile.
Le test d'existence est un pur comptage et tient en une passe. Ce n'est que s'il réussit que tu construis le parcours, avec Hierholzer plutôt qu'un retour sur trace naïf.
// Existence, graphe non oriente connexe:
// 0 sommet de degre impair -> circuit eulerien
// 2 sommets de degre impair -> chemin eulerien
// tout autre cas -> ni l un ni l autre
Hierholzer(graphe, depart):
pile = [depart]; parcours = []
tant que la pile est non vide:
u = pile.sommet
si u a une arete incidente inutilisee (u,v):
marquer cette arete comme utilisee
pile.empiler(v)
sinon:
parcours.ajouter(pile.depiler())
inverser(parcours)Hierholzer fonctionne parce qu'il n'a jamais à deviner. Il avance jusqu'à se bloquer, ce qui dans un graphe à degrés tous pairs ne peut arriver qu'au sommet de départ, puis greffe des détours depuis les sommets ayant encore des arêtes inutilisées. Chaque sommet est entré et quitté le même nombre de fois, ce que garantit exactement le degré pair, si bien que les morceaux fusionnent toujours en un unique parcours fermé.
Construis un circuit eulérien sur deux triangles partageant un unique sommet, en prenant les voisins par ordre alphabétique.
Graphe d'exemple: Arêtes non orientées A-B, B-C, C-A formant un triangle, et C-D, D-E, E-C formant un second, reliés par C.
Le circuit eulérien est A vers B vers C vers D vers E vers C vers A, utilisant les six arêtes exactement une fois et revenant au départ. Note que C apparaît deux fois dans le parcours, ce qui est autorisé et attendu: un parcours eulérien peut revisiter librement les sommets, la seule chose interdite est de réutiliser une arête. C'est toute la différence avec un chemin hamiltonien, qui visite chaque sommet une fois et ne se soucie pas des arêtes.
Temps: O(V + E) · Espace: O(V + E)
Le comptage des degrés est une passe sur les arêtes en O(E), et la vérification de connexité un parcours en O(V + E). Hierholzer empile et dépile chaque occurrence de sommet une fois et marque chaque arête utilisée exactement une fois, il est donc en O(E) à condition que chaque sommet conserve un pointeur dans sa liste d'adjacence au lieu de la reparcourir depuis le début. Sans ce pointeur, la recherche interne dégénère en O(V·E). L'espace tient aux marques d'arêtes utilisées ainsi qu'à la pile et au parcours, qui contiennent O(E) entrées. Le contraste avec les chemins hamiltoniens mérite d'être noté: l'eulérien est linéaire, l'hamiltonien est NP-complet, uniquement parce que les arêtes se comptent localement par degré alors que les sommets non.
Les problèmes eulériens sont faciles; les problèmes hamiltoniens, superficiellement semblables, ne le sont pas. Vérifie lequel tu as réellement.
| Alternative | À préférer quand | Coût |
|---|---|---|
| Chemin hamiltonien | Tu dois visiter chaque SOMMET une fois plutôt que chaque arête. NP-complet, donc des méthodes entièrement différentes s'appliquent. | exponentiel |
| Problème du postier chinois | Des sommets de degré impair existent mais tu veux tout de même une route fermée couvrant toutes les arêtes, en autorisant des répétitions au coût minimal. | O(V^3) |
| Algorithme de Fleury | Tu veux construire un parcours sans pile. Conceptuellement plus simple mais plus lent, car il évite les ponts en les testant. | O(E^2) |
| Graphes de De Bruijn | Assemblage de génomes et similaires, où les chemins eulériens dans un graphe de De Bruijn reconstituent une séquence. | O(V + E) |
Lire l'article complet: Eulerian Paths and Circuits
Algorithmes associés: Chemin Hamiltonien, Recherche en Profondeur (DFS)