Prim algoritmusa Gubicza József (GUJQAAI.ELTE)
Jellemzők Cél: Adott egyszerű gráfban a min. költségű feszítőfa meghatározása. Algoritmikus szinten: 3 tömb feltöltése; - d[1..n] a csúcsokhoz tartozó min. költségek ill. - π (parent) a csúcsokhoz tartozó szülők meghat. - a kész[1..n] segédtömb segítségével, amely azt mutatja, vizsgáltuk-e már az adott csúcsot. A gráf élcímkéi pozitív értékeket vehetnek fel, a csúcscímkék pozitív, ill. végtelent.
Az algoritmus A minimum keresés a d tömbbeli min. értékre vonatkozik a legkisebb költségű csúcs, ami még nincs kész. A fő változás a Dijkstra algoritmushoz képest, hogy itt csak az adott él hosszát (ellenőrizzük) tároljuk le, nem pedig a d[u] –val vett összegét.
d∞∞∞∞∞∞∞ π∕∕∕∕∕∕∕ Kész ∞ ∞∞ ∞ ∞ ∞∞ Kezdőállapot: minden csúcsot ∞-el címkézünk, szüleiket NIL- re állítjuk, valamint a Kész értékeket 0-kra, és kijelöljük a kezdőcsúcsot. s =
d0∞∞∞∞∞∞ π∕∕∕∕∕∕∕ Kész ∞ 0∞ ∞ ∞ ∞∞ A kezdőcsúcs értékét 0-ra állítjuk, így a FeltMinker(d[1..n], u, Kész[j] = 0) őt fogja megtalálni először. Ezt a csúcsot készre állítjuk. s =
d05∞∞∞∞∞ π∕1∕∕∕∕∕ Kész ∞ ∞ ∞ ∞∞ A csúcs minden szomszédjára megnézzük (amelyek még nincsenek Kész, 5 és 3), hogy: c(u,v) < d[v] Tehát az él, javít-e a költségen? Ha igen, d[v] = c(u,v) és π[v] := u szülő jelölése s =
d058∞∞∞∞ π∕11∕∕∕∕ Kész ∞ ∞ ∞ ∞ 8 Ha végeztünk az összes szomszéd vizsgálatával…. s =
d058∞∞8∞ π∕11∕∕2∕ Kész ∞ 8 ∞ ∞8 Iterálunk még egyet, a legkisebb költségű még nem kész elem a 2-es csúcs (d{5}), még nem kész szomszédai: 6, 4, 3 s =
d0584∞8∞ π∕112∕2∕ Kész ∞ ∞8 Mivel a 3-as csúcsba érés nem javítana a költségen 7 HAMIS, így tovább iterálunk. s =
d0584∞8∞ π∕112∕2∕ Kész ∞ ∞8 Tovább iterálunk a 4-esre, és elkezdjük vizsgálni a 6, 5 csúcsokkal s =
d058452∞ π∕11244∕ Kész ∞ 5 8 A 6-os csúcs költségén javít, így a 6-os szülője mostantól ő lesz (felülírás!), ill. az 5-ös költségén is. s =
d058452∞ π∕11244∕ Kész ∞ 58 Tovább iterálunk a 6-osra, vizsgálandó szomszédai: 7, 5 s =
d π∕ Kész A 7-es költségén javít, azonban az 5-ösön nem, mivel 8<5 hamis. s =
d π∕ Kész Tovább iterálunk a 5-ösre, ami a 7-essel nem ér el javulást, többre nem is vizsgáljuk. s =
d π∕ Kész A 7-esen nincs mit vizsgálni, csak készre jelöljük. s =
d π∕ Kész Tovább iterálunk a 3-asra, készre jelöljük, és mivel nincs nem kész szomszédja, így… s =
d π∕ Kész végeztünk. Ezzel megkaptuk eredményül a min. költségű feszítőfát a gráfunkban. s =