Het probleem
Königsberg, in wat toen Pruisen was (vandaag Kaliningrad, Rusland), lag aan weerszijden van de rivier de Pregel. In het midden van de stad splitste de rivier zich rond twee eilanden: een centraal eiland, de Kneiphof, en een tweede eiland in het oosten. Zeven bruggen verbonden deze vier stukken land:
- twee bruggen tussen de noordoever en het centrale eiland;
- twee bruggen tussen het centrale eiland en de zuidoever;
- één brug tussen de twee eilanden;
- één brug van het oostelijke eiland naar elke oever.
Bruggen overgestoken: 0 / 7
Kies een stuk land om je wandeling te starten.
Jouw doel — alle drie tegelijk:
- Steek alle 7 bruggen over
- Elk precies één keer
- Eindig waar je begon
Niet zwemmen, geen boten — alleen de bruggen.
Probeer het hierboven: de inwoners zochten naar verluidt een wandeling die elke brug precies één keer oversteekt en, in de versie op onze affiche, eindigt waar ze begon. Niemand vond er een. Geen route vinden bewijst niet dat er geen bestaat, en daar kwam Euler om de hoek kijken.
Dus… kan het?
Nee! En je hoeft niet elke route te proberen om het zeker te weten. Dit is de truc.
De in-en-uit-regel. Telkens je door een stuk land wandelt, kom je aan via de ene brug en vertrek je via een andere. De bruggen van dat stuk land worden dus in paren gebruikt: één om binnen te komen, één om weer te vertrekken.
Als je moet eindigen waar je begon, heeft elk stuk land een even aantal bruggen nodig (2, 4, 6…).
Tel ze maar:
- Noordoever 3 bruggen oneven 3 = 1 paar + 1 over
- Kneiphof 5 bruggen oneven 5 = 2 paren + 1 over
- Oost-eiland 3 bruggen oneven 3 = 1 paar + 1 over
- Zuidoever 3 bruggen oneven 3 = 1 paar + 1 over
Alle vier hebben een oneven aantal. Er blijft altijd één brug over, dus de lus is onmogelijk. Leonhard Euler vond deze truc in 1736.
Zo denken — een eenvoudige regel vinden in plaats van alles uit te proberen — is precies waar de Belgische Informatica-olympiade over gaat.
Gevarenzone Ik wil alles weten over dit probleem met grafentheorie Bewijzen, stellingen en algoritmen in het verschiet.
Let op — buiten de leerstof
Dit valt volledig buiten de leerstof voor de kwalificatierondes, de kwartfinale en de halve finale van de Belgische Informatica-olympiade. Je hebt er niets van nodig om goed te scoren.
Als je dit soort onderwerpen leuk vindt, neem dan een kijkje bij competitive programming.
Modelleren: van kaart naar graaf
Euler merkte op dat bijna alles op de kaart irrelevant is. De vorm van de eilanden, de lengte van de bruggen en de ligging van de straten kunnen het antwoord niet beïnvloeden. Slechts één ding telt: welke stukken land elke brug met elkaar verbindt.
Laat de kaart dus vallen. Vervang elk stuk land door een punt, een hoekpunt genoemd, en elke brug door een lijn tussen twee hoekpunten, een kant genoemd. Het resultaat is een graaf G = (V, E) met vier hoekpunten en zeven kanten.
Sommige paren hoekpunten zijn verbonden door twee kanten: A–B en B–D. Een graaf die zulke parallelle kanten toelaat, heet een multigraaf. In dit model wordt de puzzel een zuivere vraag over G: bestaat er een gesloten wandeling die elke kant precies één keer gebruikt? Zo’n wandeling heet een Eulercircuit. Een Eulerpad gebruikt ook elke kant precies één keer, maar mag eindigen in een ander hoekpunt dan waar het begon.
Graden
De graad deg(v) van een hoekpunt v is het aantal kanteinden dat het raakt. Anders gezegd: het is het aantal bruggen dat dat stuk land verlaat.
| Hoekpunt | Stuk land | Bruggen | Graad |
|---|---|---|---|
| A | Noordoever | 1, 2, 5 | 3 (oneven) |
| B | Centraal eiland | 1, 2, 3, 4, 6 | 5 (oneven) |
| C | Oost-eiland | 5, 6, 7 | 3 (oneven) |
| D | Zuidoever | 3, 4, 7 | 3 (oneven) |
| Som van de graden | 14 | ||
Als controle gebruiken we het handdruklemma. Elke kant heeft precies twee uiteinden, en elk uiteinde telt 1 bij de graad van één hoekpunt. Dus voor elke graaf geldt:
∑v ∈ V deg(v) = 2 |E|,
en hier 3 + 5 + 3 + 3 = 14 = 2 × 7.
Een gevolg: de som van alle graden is even, dus elke graaf heeft een even aantal hoekpunten met oneven graad.
De invariant
Stel dat een wandeling elke kant precies één keer gebruikt. Kijk naar een hoekpunt v dat noch het begin noch het einde is. Telkens de wandeling via een kant in v aankomt, moet ze via een andere, nog ongebruikte kant vertrekken. De kanten in v worden dus in paren gebruikt, één erin en één eruit. Omdat elke kant gebruikt wordt, zijn alle kanten in v gepaard, en is deg(v) even.
Enkel de twee eindpunten van de wandeling hebben elk één ongepaarde kant: de eerste kant uit het beginpunt en de laatste kant naar het eindpunt. Als de wandeling gesloten is, zijn begin en einde hetzelfde hoekpunt, en vormen die twee kanten ook een paar. De pariteit van de graad is een invariant die geen slimme route kan ontwijken.
Stelling van Euler
Zij G een samenhangende multigraaf (hoekpunten zonder kanten buiten beschouwing gelaten).
- G heeft een Eulercircuit als en slechts als elk hoekpunt een even graad heeft.
- G heeft een Eulerpad als en slechts als het 0 of 2 hoekpunten van oneven graad heeft. Bij 2 begint elk zo’n pad in het ene oneven hoekpunt en eindigt het in het andere.
Het bovenstaande argument bewijst de richting “enkel als”, en dat is alles wat de puzzel nodig heeft. Euler formuleerde het omgekeerde zonder bewijs. Carl Hierholzer bewees het in 1873 door een constructie te geven.
Königsberg heeft vier hoekpunten van oneven graad. Dat sluit een Eulercircuit uit, dat nul oneven hoekpunten vereist. Het sluit ook een Eulerpad uit, dat er hoogstens twee toelaat. De lus waar de affiche om vraagt bestaat dus niet, en evenmin een route, gesloten of open, die elke brug precies één keer oversteekt.
Waarom het ertoe doet in de informatica
De stelling van Euler vervangt zoeken door tellen. Je hoeft geen routes uit te proberen, alleen graden te tellen:
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 Dit draait in O(V + E) tijd: één keer over de kanten, dan één keer over de hoekpunten. Een volledige controle gaat ook na of alle kanten tot één samenhangende component behoren, met één keer breedte-eerst of diepte-eerst zoeken, wat eveneens O(V + E) kost. Een naïeve zoektocht die elke volgorde van de kanten uitprobeert, kan tot E! reeksen onderzoeken. Dat is 7! = 5.040 voor Königsberg, maar 20! ≈ 2,4 × 1018 voor een graaf met slechts 20 kanten.
Hetzelfde idee komt overal in de informatica terug:
- Het algoritme van Hierholzer bouwt een Eulercircuit in O(E) tijd. Volg ongebruikte kanten tot je terug bij het begin bent. Bouw daarna, vanuit een willekeurig hoekpunt van dat circuit dat nog ongebruikte kanten heeft, een nieuw circuit en voeg het erin in.
- Het Chinese-postbodeprobleem vraagt naar de kortste gesloten wandeling die elke kant minstens één keer gebruikt, zoals bij postbedeling, sneeuwploegen of veegwagens. Op ongerichte grafen is het in polynomiale tijd op te lossen. Koppel de oneven hoekpunten via een perfecte matching met minimaal gewicht, gewogen volgens de afstand van het kortste pad. Loop daarna het kortste pad tussen elk gekoppeld paar een tweede keer.
- De-Bruijngrafen bij genoomassemblage: DNA-sequencers lezen miljoenen korte fragmenten, die in overlappende deelstrings van lengte k worden geknipt. Elke deelstring wordt een gerichte kant van zijn eerste k − 1 letters naar zijn laatste k − 1 letters. Het genoom herbouwen wordt dan een zoektocht naar een Eulerpad. In gerichte grafen is de voorwaarde dat de ingraad gelijk is aan de uitgraad in elk hoekpunt, behalve dat het begin één extra uitgaande kant heeft en het einde één extra inkomende kant.
- Het Hamilton-contrast: verander “elke kant precies één keer” in “elk hoekpunt precies één keer” en geen eenvoudige graadtest werkt nog. Beslissen of een graaf een Hamiltonpad heeft, is NP-volledig. Er is geen polynomiaal algoritme bekend, en er een vinden zou P = NP bewijzen.
Oefening
De stad bouwt een achtste brug. Tussen welke twee stukken land kan ze komen zodat er een Eulerpad bestaat? Som elk paar op dat werkt, en zeg in elk geval waar de wandeling moet beginnen en eindigen.
Vervolgvraag: kan één enkele nieuwe brug ooit een Eulercircuit mogelijk maken? Wat is het minimale aantal nieuwe bruggen dat daarvoor nodig is?
Hier draait de olympiade om
Euler loste de puzzel niet op door meer routes te proberen. Hij vond het juiste model en de juiste invariant. De Belgische Informatica-olympiade vraagt hetzelfde soort redeneren, en daarna een programma dat het toepast.
De online kwalificatierondes lopen van 1 december 2026 tot 28 februari 2027. Je kunt ze op school of thuis afleggen, in Blockly of Python.