Tema
/
Algoritmai ir duomenų struktūros GO
Pamoka 14 / 15 Grafai: BFS ir DFS ~55 min
Kodas

graph.go — karkasas

Sukurk graph.go. Karkasas kaip įprasta; kūnai tavo.

Ką verta pasižymėti:

  • c.Hit() skaičiuoja BRIAUNAS, ne viršūnes — kviečiamas ten, kur svarstai, ar eiti briauna toliau. Tai ir yra O(V + E) „E" dalis.
  • AddEdge privalo išmesti kilpas ir dublikatus. Pėdsakų generatorius pagamins ir vienų, ir kitų, o pasikartojanti briauna tyliai išpūs kiekvieną šios pamokos skaičių.
  • Degrees medianai naudok skaičiavimo rikiavimą (9 pamoka), ne palyginimų — laipsnių rėžis mažytis, tai kaip tik tas atvejis.

Kur klystama

BFS žymi seen DEDANT, DFS — IMANT. Tai atrodo kaip smulkmena ir nėra.

BFS: pažymėk viršūnę tą akimirką, kai ją dedi į eilę. Jei pažymėsi tik ją išimdamas, ta pati viršūnė pateks į eilę kelis kartus per skirtingus sluoksnius, ir prev[w] bus perrašytas ilgesniu keliu. Paieška vis tiek ras kelią — tiesiog nebe trumpiausią. Testas tai pagaus, bet pirmiausia tai turi pagauti tu.

DFS: čia atvirkščiai. Viršūnė gali teisėtai patekti į steką kelis kartus, kol jos eilė ateis, tad tikrinti reikia imant.

Ta pati eilutė, dvi skirtingos vietos, ir priežastis abiem atvejais ta pati: eilė lanko sluoksniais, stekas — ne.

Spąstai

DFS ir DFSRecursive grąžins skirtingus kelius, ir tai ne klaida.

Steko versija sudeda visus kaimynus ir tada ima paskutinį; rekursinė versija eina jais iš eilės nuo pirmo. Kaimynų aplankymo tvarka priešinga, tad pėdsakai skiriasi.

Abu keliai tikri, abu veda ten, kur reikia, ir nė vienas nėra trumpiausias. Testas TestTheTwoDFSVersionsDisagreeOnPaths reikalauja, kad jie skirtųsi — antra pratybų užduotis apie tai, kaip juos suderinti.