A Kombinatorika és
gráfelmélet 1. tárgyból megismert szélességi keresés
algoritmussal megtalálhatunk egy lehető legkevesebb élből álló
utat egy gráfban két adott csúcs között. A feladat ennek az
algoritmusnak a beprogramozása.
Az algoritmus bemenete egy irányított egyszerű gráf, amit a
következő módon adunk meg egy szöveges (.text) fájlban:
A fájl első sorában az \(N\), \(M\), \(S\) és \(T\)
természetes számok találhatóak szóközökkel elválasztva.
A \(\vec{G} = (V, \vec{E})\) irányított egyszerű gráf
csúcsai a \(V = \{0, 1, 2, \ldots, N-1\}\) számok.
Az élek száma \(\left| \vec{E} \right| = M\).
Az \(S \in V\) csúcsból szeretnénk egy legkevesebb élből
álló utat keresni a \(T \in V\) csúcsba (\(S \ne T\)).
A fájl további \(M\) sora rendre \(U_i\), \(V_i\)
számpárokat tartalmaz. Egy ilyen számpár megfelel egy \((U_i,
V_i) \in \vec{E}\) élnek. Egy él csak egyszer szerepel a
fájlban.
A program, ha létezik út az \(S\) és \(T\) csúcsok között,
akkor az \(S\) csúccsal kezdve sorban megadja annak csúcsait a
\(T\) csúcsig. Ha nincs út, akkor kiírja, hogy „Nem létezik
út!”.
Segítségképp megadjuk
a graph.py
fájlban a gráfot beolvasó és a megtalált utat kiíró függvényt, így
csak magát a keresést kell megvalósítani
az utat_keres függvényben.
A függvény
első, graf paramétere
a gráf éllistás ábrázolása. Az éllistát egy szótárral
(dictionary) adjuk meg, melyben minden csúcshoz egy lista
tartozik. A lista elemei a kimenő éleken elérhető
csúcsok. Például az alábbi fájlban leírt gráfhoz
A honnan
paraméter az út első, \(S\) csúcsát, míg
a hova paraméter az
út utolsó, \(T\) csúcsát adja meg.
A megoldáshoz felhasználható
az utat_kiolvas
függvény, ami egy (nem feltétlenül teljes) szélességi fából
kiolvas egy utat
a honnan
és hova csúcsok
között. A szélességi fát
a szulo szótárban
kell megadni, ahol az egyes csúcsokhoz rendelt érték a szülőjük
azonosítója a szélességi fában. Például
Az algoritmus megvalósításánál nem szükséges az éleket fa-,
előre-, vissza- és keresztélekre bontani, mivel ezek nélkül is
kiolvasható egy legrövidebb út. Az egész gráfot sem kell
bejárni, elég akkora részét, hogy meg lehessen találni egy
legrövidebb utat.
Várakozási sor megvalósítására alkalmasak a beépített
listákappend
és pop(0) függvényei, de ki lehet
próbálni a Python
3 queue
modulját is.
Próbáljuk ki az elkészült programot
a graph1.text
és graph2.text
bemenetekre, de teszteljük más, saját készítésű teszbemeneteken
is!