Primăria trebuie să lege TOȚI stâlpii de iluminat cu cabluri, iar cablul costă. Nu ne interesează drumuri de la un stâlp la altul — ne interesează REȚEAUA ÎNTREAGĂ, cu lungime totală minimă. Asta e acoperirea de cost minim, iar algoritmul lui Prim o crește muchie cu muchie.
Dintre toate „schemele de cablare" care leagă cele 6 noduri, o alegem pe cea mai ieftină.
Parțial — păstrăm toate nodurile, alegem doar o parte din muchii (graful parțial, M04!). Arbore — conex și FĂRĂ cicluri: un ciclu ar însemna un cablu în plus degeaba. Un arbore cu n noduri are mereu exact n−1 muchii — la noi: 5 cabluri pentru 6 stâlpi.
Pornești dintr-un nod și crești rețeaua ca un cristal: la fiecare pas adaugi cea mai ieftină muchie care leagă un nod DIN rețea de unul DIN AFARA ei. Lăcomie pură (X·M12) — și, ca la Dijkstra, cu certificat de corectitudine.
Același graf ca la Dijkstra (M07) — dinadins! Verde = în rețea, auriu punctat = muchiile-candidat de la granița rețelei, albastru = încă nelegat.
Aceeași schelă (fixează minimul, actualizează vecinii), un singur rând de cod diferit — și rezultate complet diferite.
| Dijkstra (M07) | Prim (M08) | |
|---|---|---|
| obiectiv | drum minim de la sursă spre FIECARE nod | rețea totală minimă care leagă TOATE nodurile |
| actualizarea | d[v] = min(d[v], d[u] + c[u][v]) — cost CUMULAT | d[v] = min(d[v], c[u][v]) — DOAR muchia! |
| rezultat | vector de distanțe + arborele drumurilor | arborele parțial de cost minim |
| pe graful nostru | drumul 1→6 costă 12 | toată rețeaua costă 13 |
Cinci întrebări despre Prim.
Prim, condensat. Cu asta, Faza 2 — grafurile — e completă!