Een studentenraad telt negen leden. Om privacyredenen zullen we de studenten aanduiden met de letters A, B, …, I. Door een onderlinge vete spreken niet alle studenten met elkaar. Onderstaande tabel toont welke studenten met elkaar spreken — 1 betekent dat de twee studenten met elkaar spreken en 0 betekent dat de twee studenten niet met elkaar spreken.

  A B C D E F G H I
A - 0 0 1 0 0 1 0 0
B 0 - 1 1 1 1 1 1 1
C 0 1 - 0 0 0 1 1 0
D 1 1 0 - 1 0 1 0 1
E 0 1 0 1 - 0 1 0 0
F 0 1 0 0 0 - 0 0 1
G 1 1 1 1 1 0 - 0 0
H 0 1 1 0 0 0 0 - 0
I 0 1 0 1 0 1 0 0 -

Merk op dat wie met wie spreekt een symmetrische relatie is: als student $$x$$ spreekt met student $$y$$, dan spreekt student $$y$$ ook met student $$x$$. Daardoor is ook de tabel symmetrisch: de twee delen aan elke kant van de hoofddiagonaal zijn elkaars spiegelbeeld. We kennen dus de volledige relatie als we de waarden boven de hoofddiagonaal kennen (aangeduid in het blauw).

Onlangs stuurde student A een gerucht de wereld in, dat door elke andere student juist één keer werd opgevangen. Elke student ving het gerucht juist één keer op van een student waarmee hij sprak, en gaf het ook door aan juist één andere student waarmee hij sprak. Tellen we student A als nul, dan was student E de achtste en laatste student die het gerucht opving. Wie was de vierde student die het gerucht opving?

We weten dat A aan het begin van de ketting staat en E aan het einde. Van de anderen spreken F en H elk met slechts twee andere studenten. Dus moet F het gerucht doorgeven tussen B en I (in de ene of de andere richting, dus BFI of IFB), en moet H het gerucht doorgeven tussen B en C (dus BHC of CHB). Als we deze fragmenten samenvoegen, dan moeten we dus CHBFI of IFBHC hebben. We kunnen dit grotere fragment niet rechtstreeks verbinden met de eindpunten A of E, omdat noch C noch I met een van beide spreekt. Dat betekent dat de overige studenten, D en G, aan beide uiteinden van de grotere fragmenten moeten staan, voordat we de eindpunten kunnen bevestigen. Het verlengde fragment is dus GCHBFID of DIFBHCG, en met de eindpunten A en E toegevoegd krijgen we de volledige ketting AGCHBFIDE of ADIFBHCGE. In beide gevallen geldt dat als we A als nul tellen, de vierde student B is.

Opgave

Voor een studentenraad met $$n$$ studenten ($$2 \leq n \leq 26$$) duiden we de studenten aan met de eerste $$n$$ hoofdletters (str) van het alfabet. Gevraagd wordt:

Je mag ervan uitgaan dat er enkel argumenten worden doorgegeven aan deze functies die voldoen aan de beschrijving uit de opgave, zonder dat dit expliciet moet gecontroleerd worden.

Voorbeeld

Deze interactieve sessie werkt met de spreektabel uit de inleiding van deze opgave.

>>> tabel = vul_tabel(9, '001001001111111000110101010100001000')
>>> tabel
[[None, False, False, True, False, False, True, False, False], [False, None, True, True, True, True, True, True, True], [False, True, None, False, False, False, True, True, False], [True, True, False, None, True, False, True, False, True], [False, True, False, True, None, False, True, False, False], [False, True, False, False, False, None, False, False, True], [True, True, True, True, True, False, None, False, False], [False, True, True, False, False, False, False, None, False], [False, True, False, True, False, True, False, False, None]]
>>> print_tabel(tabel)
  A B C D E F G H I
A - 0 0 1 0 0 1 0 0
B 0 - 1 1 1 1 1 1 1
C 0 1 - 0 0 0 1 1 0
D 1 1 0 - 1 0 1 0 1
E 0 1 0 1 - 0 1 0 0
F 0 1 0 0 0 - 0 0 1
G 1 1 1 1 1 0 - 0 0
H 0 1 1 0 0 0 0 - 0
I 0 1 0 1 0 1 0 0 -
>>> spreekt_met('A', tabel)
{'D', 'G'}
>>> spreekt_met('B', tabel)
{'C', 'D', 'E', 'F', 'G', 'H', 'I'}
>>> spreken_met_elkaar('A', 'B', tabel)
False
>>> spreken_met_elkaar('G', 'A', tabel)
True
>>> is_ketting('AGCHBFIDE', tabel)
True
>>> is_ketting('ADIFBHCGE', tabel)
True
>>> kettingen('A', 'E', tabel)
{'ADIFBHCGE', 'AGCHBFIDE'}
>>> kettingen('H', 'F', tabel)
{'HCBEGADIF', 'HCGADEBIF'}
>>> kettingen('I', 'A', tabel)
{'IFBHCGEDA'}
>>> kettingen('B', 'D', tabel)
set()

Bronnen