Tema
/
Algoritmai ir duomenų struktūros GO
Pamoka 15 / 15 Svoriniai grafai ~60 min
Kodas

wgraph.go — karkasas

Sukurk wgraph.go. Paskutinis karkasas kurse.

Didžioji dalis jo — jau parašytas kodas:

  • WGraph yra keturioliktos pamokos Graph su vienu lauku briaunoje;
  • BFSW yra ta pati BFS, perkelta be pakeitimų;
  • NodeHeap yra tryliktos pamokos krūva su kitu turiniu. Tas pats masyvas-medis, tie patys 2i+1 ir (i−1)/2, tas pats kilimas ir leidimasis. Pasikeitė tik tai, kas guli masyve.

Iš tikrųjų naujo yra du: DijkstraHeap ir DijkstraScan.

Ką verta pasižymėti:

  • Skaitiklis skaičiuoja FRONTIER darbą — kiekvieną palyginimą, kurį eilė atlieka rinkdamasi, kas toliau. Krūvoje tai palyginimai kylant ir leidžiantis; tiesinėje peržiūroje — kiekvienas peržiūrėtas mazgas. Tai vienintelis dydis, kurį penktas žingsnis lygina, ir būtent jį rodo transit diagnostika.
  • Tinginė šalinimas, ne raktų mažinimas. Radęs pigesnį kelią, dėk mazgą į krūvą dar kartą. Ištraukęs mazgą, kuris jau done, praleisk.
  • Grąžink ir settled — kiek mazgų buvo galutinai apdorota. Abu variantai turi grąžinti tą patį skaičių; jei nesutampa, vienas iš jų ne tą daro.
  • DijkstraScan nėra taisytina. Ji lėta sąmoningai.
Spąstai

if v == to tikrinama ištraukus, ne įdėjus.

Grąžinus kelią tuo metu, kai to pirmą kartą patenka į eilę, gausi pirmą rastą kelią, ne pigiausią — nes pigesnis gali atsirasti vėliau. Tai lygiai ta pati klaida, kurią keturioliktoje pamokoje darė seen žymėjimas ne toje vietoje, tik dabar ji kainuoja teisingumą, o ne kelio ilgį.

Krūvos pažadas galioja ištraukimo momentu: tik tada žinoma, kad pigesnio nebėra.