Een handige bewerking op een grafe is het opvragen van alle buren van een knoop: dat zijn alle knopen waarmee die knoop rechtstreeks verbonden is via een boog.

👀 Voorbeeld - Waar geraak je rechtstreeks vanuit Gent?

Beschouw opnieuw de grafe van Vlaamse steden en snelwegen:

vlaamse-steden-grafe

De buren van Gent zijn Antwerpen, Brussel en Kortrijk. Dat zijn alle steden waarmee Gent rechtstreeks verbonden is via een snelweg.

💡 Waarvoor gebruik je buren?

De methode buren() is een basisbouwsteen voor veel toepassingen:

  • Navigatie-apps zoals Google Maps gebruiken buren om te bepalen welke wegen je vanuit een kruispunt kan nemen.
  • Sociale netwerken zoals LinkedIn tonen je de connecties van een persoon — dat zijn de buren van die knoop in het netwerk.
  • Aanbevelingssystemen stellen producten voor die gekocht zijn door mensen die ook jouw aankopen deden — buren in een koopgedrag-grafe.

💻 Programmeeroefening - Buren vinden

Kopieer en plak de klasse Grafe in de editor hieronder.

class Grafe:
    def __init__(self, knopen, bogen):
        self.knopen = knopen
        self.bogen = bogen

    def nieuw(self, boog):
        self.bogen.add(boog) 
        k1 = boog[0]
        k2 = boog[1]
        self.knopen.add(k1)
        self.knopen.add(k2) 

    def buren(self, knoop):
        resultaat = set()
        ...
        return resultaat

Opdracht:

Vervolledig de methode buren() zodat ze een verzameling teruggeeft met alle knopen die rechtstreeks verbonden zijn met knoop via een boog.

Aanpak:

Loop over alle bogen in self.bogen. Een boog is een tuple van twee knopen, bijvoorbeeld ('Gent', 'Brussel'). Als één van de twee knopen gelijk is aan knoop, dan is de andere knoop een buur.

Voorbeelden:

snelwegen = Grafe(
    {'Gent', 'Brussel', 'Antwerpen', 'Kortrijk', 'Hasselt'},
    {('Gent', 'Brussel'), ('Gent', 'Antwerpen'), ('Gent', 'Kortrijk'),
     ('Brussel', 'Antwerpen'), ('Brussel', 'Hasselt')}
)

snelwegen.buren('Gent')      # -> {'Brussel', 'Antwerpen', 'Kortrijk'}
snelwegen.buren('Hasselt')   # -> {'Brussel'}
snelwegen.buren('Kortrijk')  # -> {'Gent'}

Let op: een boog ('A', 'B') betekent dat zowel A een buur is van B als B een buur is van A. De grafe is ongerichte, dus de volgorde in de tuple maakt niet uit.