Proiect realizat de: Capota Alina

si Predescu Iulia
 Descrierea algoritmului
 Implementarea algoritmului
 Aplicatie practica
 Exemplu
 Programul in C++
 Algoritmul lui Kruskal, scris de Joseph Kruskal în 1956, este un algoritm în
teoria grafurilor care găseşte arborele parţial de cost minim pentru un graf
conex ponderat (graf in care fiecare muchie are asociat un cost). Cu alte
cuvinte, găseşte submulţimea muchiilor care formează un arbore care
include toate vârfurile şi care este minimizat din punct de vedere al
costului. Dacă graful nu este conex, atunci algoritmul găseşte un arbore
parţial de cost minim pentru fiecare componentă conexă. Algoritmul lui
Kruskal este un exemplu de algoritm greedy.
Pentru implementarea algoritmului este necesară rezolvarea următoarelor două
probleme:
 – cum extragem muchia de cost minim
 – cum testăm dacă muchia selectată formează sau nu cicluri cu cele deja selectate.
Pentru a extrage minimul, o idee ar fi să sortăm muchiile crescător după cost şi să
parcurgem secvenţial muchiile ordonate. Pentru a realiza sortarea muchiilor grafului,
vom reprezenta graful prin lista muchiilor (un vector cu m componente, fiecare
componentă fiind o structură în care reţinem cele două extremităţi şi costul muchiei).
O muchie va forma cicluri cu muchiile deja selectate dacă şi numai dacă între
extremităţile muchiei există cel puţin un lanţ.
Pentru a testa dacă o muchie formează cicluri cu muchiile deja selectate este suficient
să testăm dacă extremităţile muchiei se găsesc în aceeaşi componentă conexă. Pentru
aceasta va trebui să ţinem permanent evidenţa componentelor conexe (arborilor) care
se formează.

Reprezentarea informaţiilor:

n – numărul de vârfuri
m – numărul de muchii din graf
G – graful dat, reprezentat prin lista muchiilor (un vector cu m
componente, fiecare componentă fiind o structură în care
reţinem cele două extremităţi şi costul muchiei)
A – arborele parţial de cost minim, reprezentat ca un vector n-1
componente în care vom reţine indicii din G ai muchiilor
selectate
c – vector cu n componente în care vom reţine evidenţa
componentelor conexe (c[i] = componenta conexă căreia îi
aparţine vârful i)
 Trebuie sa conectam 3 orase la o retea telefonica:
Bucuresti, Timisoara si Arad.
 Necesar cablu: 1300 km.

60
600
640
 E inutil sa executam toate cele trei conexiuni, numai doua din ele sunt
suficiente pentru o comunicare in bune conditii intre oricare 2 orase.
 De exemplu, legatura Timisoara – Arad ar putea lipsi, caz in care
necesarul de cablu devine 1240 km.

640
600
 Sau legatura Timisoara – Bucuresti ar putea lipsi,
necesarul de cablu devenind 700 km.

60
640
 Oricare 2 legaturi sunt suficiente, deoarece semnalul electric circula
suficient de rapid ca un abonat din Timisoara care doreste sa vorbeasca cu
unul din Arad (de exemplu) sa nu-si dea seama ca nu exista legatura
directa intre Timisoara si Arad si ca apelul sau este rutat prin Bucuresti.

 Din punctul de vedere al necesarului de cablu, lucrurile nu mai stau la fel.

 Conteaza foarte mult care legaturi vor fi realizate si care nu.

 Cel mai ieftin ar fi sa alegem legaturile Arad – Timisoara si Timisoara –
Bucuresti si sa evitam legatura Arad - Bucuresti, necesarul de cablu
ajungand in acest caz la 660 km; aceasta este situatia optima – sau
“acoperirea minima” a retelei.


 Notăm cu n numărul de vârfuri din graf (n=|X|). Iniţial
considerăm că nici o muchie din graf nu a fost selectată, deci
fiecare vârf din graf este vârf izolat. Cu alte cuvinte, la
momentul iniţial avem o pădure formată din n arbori, fiecare
arbore fiind format dintr-un singur vârf. La fiecare pas se
selectează o muchie de cost minim care nu a mai fost
selectată şi care nu formează cicluri cu muchiile deja
selectate.
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
2
3
4
5
1
1
1
4
3 2
Exemplu:
Pasul 1:Selectăm o muchie de cost minim. (În cazul
nostru, de cost 1).Observaţi că în graful parţial selectat
există n - 1 = 4 arbori, pentru că am unificat arborii
corespunzători extremităţilor muchiei selectate. Arborii
sunt: { 1, 3 }; { 2 }; { 4 }; { 5 }.
Pasul 2: Selectăm din nou o muchie de cost
minim.(Costul minim fiind 1).Observaţi că în graful
parţial selectat există n - 2 = 3 arbori. Arborii sunt:{ 1, 3,
4 }; { 2 }; { 5 }.
Pasul 3: La acest pas nu mai putem selecta o muchie de
cost 1, deoarece s-ar obţine un ciclu. Selectăm muchia
de cost 2.Arborii sunt: { 1, 2, 3, 4 }; { 5 }.
 Pasul 4: Selectând, în final, muchia de cost 3, obţinem
un graf fără cicluri cu n-1 muchii, deci un arbore.
Cod C++: