Le problème
Königsberg, dans ce qui était alors la Prusse (aujourd’hui Kaliningrad, en Russie), était bâtie sur les deux rives de la rivière Pregel. Au centre de la ville, la rivière se divisait autour de deux îles : une île centrale, le Kneiphof, et une seconde île à l’est. Sept ponts reliaient ces quatre morceaux de terre :
- deux ponts entre la rive nord et l’île centrale ;
- deux ponts entre l’île centrale et la rive sud ;
- un pont entre les deux îles ;
- un pont entre l’île orientale et chacune des rives.
Ponts traversés : 0 / 7
Choisissez un endroit pour commencer votre promenade.
Votre objectif — les trois à la fois :
- Traversez les 7 ponts
- Chacun exactement une fois
- Terminez là où vous avez commencé
Pas de nage, pas de bateau : uniquement les ponts.
Essayez ci-dessus : les habitants auraient cherché une promenade qui traverse chaque pont exactement une fois et, dans la version de notre affiche, se termine là où elle a commencé. Personne n’en a trouvé. Ne pas trouver de parcours ne prouve pas qu’il n’en existe pas, et c’est là qu’Euler est intervenu.
Alors… est-ce possible ?
Non ! Et il n’est pas nécessaire d’essayer tous les parcours pour en être sûr. Voici l’astuce.
La règle de l’entrée et de la sortie. Chaque fois que vous passez par un morceau de terre, vous y arrivez par un pont et vous en repartez par un autre. Les ponts de ce morceau de terre sont donc utilisés par paires : un pour entrer, un pour sortir.
Si vous devez terminer là où vous avez commencé, chaque morceau de terre doit avoir un nombre pair de ponts (2, 4, 6…).
Comptez-les :
- Rive nord 3 ponts impair 3 = 1 paire + 1 en trop
- Kneiphof 5 ponts impair 5 = 2 paires + 1 en trop
- Île orientale 3 ponts impair 3 = 1 paire + 1 en trop
- Rive sud 3 ponts impair 3 = 1 paire + 1 en trop
Les quatre ont un nombre impair. Il reste toujours un pont en trop, donc la boucle est impossible. Leonhard Euler a trouvé cette astuce en 1736.
Raisonner ainsi — trouver une règle simple plutôt que tout essayer — c’est exactement l’esprit de l’Olympiade belge d’Informatique.
Zone dangereuse Je veux tout savoir sur ce problème grâce à la théorie des graphes Preuves, théorèmes et algorithmes en vue.
Attention — hors programme
Ceci est entièrement hors programme pour les épreuves de qualification, le quart de finale et la demi-finale de l’Olympiade belge d’Informatique. Vous n’en avez pas besoin pour bien réussir.
Si ce genre de sujet vous plaît, jetez un œil à la programmation compétitive.
Modélisation : de la carte au graphe
Euler a remarqué que presque tout ce qui figure sur la carte est sans importance. La forme des îles, la longueur des ponts et le tracé des rues ne peuvent pas influencer la réponse. Une seule chose compte : quels morceaux de terre chaque pont relie.
Écartons donc la carte. Remplaçons chaque morceau de terre par un point, appelé sommet, et chaque pont par un trait entre deux sommets, appelé arête. On obtient un graphe G = (V, E) à quatre sommets et sept arêtes.
Certaines paires de sommets sont reliées par deux arêtes : A–B et B–D. Un graphe qui autorise de telles arêtes parallèles s’appelle un multigraphe. Dans ce modèle, l’énigme devient une question purement sur G : existe-t-il une marche fermée qui utilise chaque arête exactement une fois ? Une telle marche s’appelle un cycle eulérien. Un chemin eulérien utilise lui aussi chaque arête exactement une fois, mais peut se terminer en un sommet différent de celui de départ.
Les degrés
Le degré deg(v) d’un sommet v est le nombre d’extrémités d’arêtes qui le touchent. De façon équivalente, c’est le nombre de ponts qui partent de ce morceau de terre.
| Sommet | Morceau de terre | Ponts | Degré |
|---|---|---|---|
| A | Rive nord | 1, 2, 5 | 3 (impair) |
| B | Île centrale | 1, 2, 3, 4, 6 | 5 (impair) |
| C | Île orientale | 5, 6, 7 | 3 (impair) |
| D | Rive sud | 3, 4, 7 | 3 (impair) |
| Somme des degrés | 14 | ||
Pour vérifier, utilisons le lemme des poignées de main. Chaque arête a exactement deux extrémités, et chaque extrémité ajoute 1 au degré d’un sommet. Donc, pour tout graphe,
∑v ∈ V deg(v) = 2 |E|,
et ici 3 + 5 + 3 + 3 = 14 = 2 × 7.
Une conséquence : la somme de tous les degrés est paire, donc tout graphe a un nombre pair de sommets de degré impair.
L’invariant
Supposons qu’une marche utilise chaque arête exactement une fois. Considérons un sommet v qui n’est ni son départ ni son arrivée. Chaque fois que la marche arrive en v par une arête, elle doit repartir par une autre arête, non utilisée. Les arêtes en v sont donc utilisées par paires, une qui entre et une qui sort. Comme toutes les arêtes sont utilisées, toutes les arêtes en v sont appariées, et deg(v) est pair.
Seules les deux extrémités de la marche ont chacune une arête non appariée : la première arête qui quitte le départ et la dernière qui arrive à l’arrivée. Si la marche est fermée, le départ et l’arrivée sont le même sommet, et ces deux arêtes forment elles aussi une paire. La parité du degré est un invariant qu’aucun parcours astucieux ne peut contourner.
Théorème d’Euler
Soit G un multigraphe connexe (en ignorant les sommets sans arêtes).
- G possède un cycle eulérien si et seulement si tous ses sommets sont de degré pair.
- G possède un chemin eulérien si et seulement s’il a 0 ou 2 sommets de degré impair. Avec 2, tout chemin de ce type commence à l’un des sommets impairs et se termine à l’autre.
L’argument ci-dessus démontre le sens « seulement si », ce qui suffit pour l’énigme. Euler a énoncé la réciproque sans preuve. Carl Hierholzer l’a démontrée en 1873 en donnant une construction.
Königsberg a quatre sommets de degré impair. Cela exclut un cycle eulérien, qui n’en admet aucun. Cela exclut aussi un chemin eulérien, qui en admet au plus deux. La boucle demandée sur l’affiche n’existe donc pas, pas plus que n’importe quel parcours, fermé ou ouvert, qui traverse chaque pont exactement une fois.
Pourquoi c’est important en informatique
Le théorème d’Euler remplace une recherche par un comptage. Inutile d’essayer des parcours : il suffit de compter les degrés :
from collections import Counter
def euler_kind(edges):
"""Classify a connected multigraph given as a list of edges (u, v)."""
degree = Counter()
for u, v in edges:
degree[u] += 1
degree[v] += 1
odd = sum(1 for d in degree.values() if d % 2 == 1)
if odd == 0:
return "Eulerian circuit"
if odd == 2:
return "Eulerian path"
return "neither"
koenigsberg = [("A", "B"), ("A", "B"), ("B", "D"), ("B", "D"),
("A", "C"), ("B", "C"), ("C", "D")]
print(euler_kind(koenigsberg)) # neither: four odd vertices Cela s’exécute en temps O(V + E) : un passage sur les arêtes, puis un sur les sommets. Une vérification complète contrôle aussi que toutes les arêtes appartiennent à une seule composante connexe, avec un parcours en largeur ou en profondeur, lui aussi en O(V + E). Une recherche naïve qui essaie tous les ordres possibles des arêtes peut examiner jusqu’à E ! séquences. Cela fait 7 ! = 5 040 pour Königsberg, mais 20 ! ≈ 2,4 × 1018 pour un graphe de seulement 20 arêtes.
La même idée apparaît partout en informatique :
- L’algorithme de Hierholzer construit un cycle eulérien en temps O(E). On suit des arêtes inutilisées jusqu’à revenir au départ. Ensuite, depuis n’importe quel sommet de ce cycle qui a encore des arêtes inutilisées, on construit un autre cycle et on l’insère.
- Le problème du postier chinois cherche la plus courte marche fermée qui utilise chaque arête au moins une fois, comme pour la distribution du courrier, les chasse-neige ou les balayeuses de rue. Sur les graphes non orientés, il se résout en temps polynomial. On apparie les sommets de degré impair par un couplage parfait de poids minimum, pondéré par la distance du plus court chemin. Puis on parcourt une seconde fois le plus court chemin entre chaque paire appariée.
- Les graphes de de Bruijn en assemblage de génomes : les séquenceurs d’ADN lisent des millions de courts fragments, découpés en sous-chaînes qui se chevauchent, de longueur k. Chaque sous-chaîne devient une arête orientée allant de ses k − 1 premières lettres à ses k − 1 dernières lettres. Reconstruire le génome revient alors à chercher un chemin eulérien. Dans les graphes orientés, la condition est que le degré entrant soit égal au degré sortant en chaque sommet, sauf que le départ a une arête sortante de plus et l’arrivée une arête entrante de plus.
- Le contraste hamiltonien : remplacez « chaque arête exactement une fois » par « chaque sommet exactement une fois » et aucun simple test de degrés ne fonctionne plus. Décider si un graphe possède un chemin hamiltonien est NP-complet. Aucun algorithme polynomial n’est connu, et en trouver un prouverait que P = NP.
Exercice
La ville construit un huitième pont. Entre quels deux morceaux de terre pourrait-il se trouver pour qu’un chemin eulérien existe ? Listez toutes les paires qui conviennent et indiquez, dans chaque cas, où la marche doit commencer et se terminer.
Pour aller plus loin : un seul nouveau pont peut-il jamais rendre un cycle eulérien possible ? Quel est le nombre minimal de nouveaux ponts nécessaires pour cela ?
Voilà l’esprit de l’olympiade
Euler n’a pas résolu l’énigme en essayant plus de parcours. Il a trouvé le bon modèle et le bon invariant. L’Olympiade belge d’Informatique demande le même type de raisonnement, puis un programme qui l’applique.
Les épreuves de qualification en ligne se déroulent du 1er décembre 2026 au 28 février 2027. Vous pouvez les passer à l’école ou à la maison, en Blockly ou en Python.