Didaxis
lecție · Informatică

Arbore parțial de cost minim

Selectarea muchiilor pentru conectare minimă.

Se face în:
Clasa a XI-a
Actualizat la: 30 octombrie 2026
1pe scurtstratul 1 din 2 · rezumatul lecției

Pe scurt

Un arbore parțial al unui graf neorientat conex păstrează toate vârfurile și exact atâtea muchii cât să le unească fără cicluri. Dintre acești arbori, cel de cost minim are suma ponderilor cea mai mică. Pentru un triunghi cu costuri 1, 2 și 5, alegem muchiile de cost 1 și 2; costul total este 3.

Desen la lecția „Arbore parțial de cost minim”
2în detaliustratul 2 din 2 · pentru clasă și Bacalaureat

În detaliu

Un arbore parțial al unui graf neorientat conex este un graf parțial care este arbore: păstrează toate cele vârfuri și exact muchii, astfel încât să rămână conex și fără cicluri. Într-un graf ponderat, costul arborelui este suma ponderilor muchiilor alese, iar arborele parțial de cost minim este cel cu suma cea mai mică. În exemplul cu trei vârfuri, două muchii sunt suficiente; alegerea tuturor celor trei ar crea un ciclu și ar costa 8 în triunghiul cu ponderile 1, 2 și 5. Dacă graful nu este conex, nu există arbore parțial care să acopere toate vârfurile; se poate obține doar o pădure de arbori, câte unul pentru fiecare componentă.

Kruskal ordonează muchiile crescător după cost și le adaugă numai dacă nu creează un ciclu, adică numai dacă extremitățile lor sunt în componente diferite. Prim pornește dintr-un vârf și adaugă de fiecare dată muchia de cost minim care unește arborele construit cu un vârf din afara lui. Pentru triunghiul cu costurile : 2, : 3 și : 7, ambele metode aleg primele două muchii și obțin costul total .

Exemplul 1 — algoritmul lui Kruskal. Programul sortează muchiile după cost și folosește o structură de mulțimi disjuncte: două vârfuri sunt în aceeași componentă dacă au aceeași rădăcină.

#include <algorithm>
#include <iostream>
using namespace std;
struct Muchie { int x, y, c; };
int t[11];
int radacina(int x) { return t[x] == x ? x : t[x] = radacina(t[x]); }
int main() {
    int n, m;
    Muchie e[50];
    cin >> n >> m;
    for (int i = 0; i < m; ++i) cin >> e[i].x >> e[i].y >> e[i].c;
    stable_sort(e, e + m, [](const Muchie& a, const Muchie& b) { return a.c < b.c; });
    for (int i = 1; i <= n; ++i) t[i] = i;
    int cost = 0;
    for (int i = 0; i < m; ++i) {
        int a = radacina(e[i].x), b = radacina(e[i].y);
        if (a != b) {
            t[a] = b;
            cost += e[i].c;
            cout << e[i].x << "-" << e[i].y << " ";
        }
    }
    cout << "\n" << cost;
}

Graful are 4 vârfuri și muchiile cu costul 4, cu 1, cu 2, cu 5 și cu 3. Pentru intrarea 4 5 urmată de aceste muchii, programul afișează 1-3 2-3 3-4, apoi 6. Muchia de cost 4 este respinsă, fiindcă 1 și 2 sunt deja în aceeași componentă prin 1–3–2, iar muchia de cost 5 este respinsă, fiindcă 4 a fost deja legat prin . Se aleg exact muchii. Sortarea cere timp.

Exemplul 2 — algoritmul lui Prim pe același graf. Se pornește din vârful 1. Dintre muchiile care ies din , cea mai ieftină este cu 1. Din ies cu 4, cu 2 și cu 3; se alege . Din ies cu 5 și cu 3; se alege . Costul este , ca la Kruskal. Dacă toate ponderile sunt distincte, arborele parțial de cost minim este unic; dacă există ponderi egale, pot exista mai mulți arbori cu același cost minim, dar costul minim este același.

Costul minim se calculează adunând doar muchiile alese, nu toate muchiile. Un arbore parțial are muchii, deci costul unui arbore parțial nu poate fi calculat ca suma celor mai mici costuri fără să verifici ciclurile. Dacă un graf conex are vârfuri, orice arbore parțial al lui are 4 muchii.

Exemplul 3 — în formatul examenului. Un graf ponderat are 5 vârfuri și muchiile cu costul 3, cu 1, cu 2, cu 4, cu 1, cu 6 și cu 5. Care este costul unui arbore parțial de cost minim?

  • a) 7
  • b) 8
  • c) 9
  • d) 10

Răspunsul corect este b). Kruskal alege, în ordinea costurilor, (1), (1), (2); muchia (3) se respinge, fiindcă 1, 2 și 3 sunt deja unite și ar apărea ciclul 1–2–3. Muchia (4) unește componentele și și se alege. Costul este , iar arborele are 4 muchii. Varianta a) adună cele mai mici patru costuri, 1, 1, 2 și 3, dar muchia de cost 3 închide un ciclu. Variantele c) și d) sunt costuri ale unor arbori parțiali, dar nu minimi: c) folosește (5) în loc de (4), iar d) folosește (6).

Greșeli frecvente

  • Greșit: un arbore parțial minim este un drum de cost minim între două vârfuri.
    Corect: unește toate vârfurile la cost total minim.
  • Greșit: un arbore pe vârfuri are muchii.
    Corect: are .
  • Greșit: graful neconex are totuși un arbore parțial care acoperă toate vârfurile.
    Corect: nu există fără legături între componente.
în contul tăuPremium

Testează-te pe această lecție

Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.

Înainte și după

Surse și referințe

Redactare proprie, conform programei:

  • OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa XI intensiv; rocnee.eu

Documente consultate

  • Programa școlară de informatică intensiv, clasa a XI-a (OMECI 5099/2009, anexa 5), CNCE, p. 4–5; rocnee.eu
  • OpenDSA, capitolul „Minimal Cost Spanning Trees”, opendsa.cs.vt.edu/OpenDSA/Books/Catalog/html/MCST.html

Desene: Redactare proprie (desen original)

lecțiile sunt gratuite

Ai citit lecția. Acum verifică-te.