Sunteți pe pagina 1din 12

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 gsete arborele parial de cost minim pentru un graf
conex ponderat (graf in care fiecare muchie are asociat un cost). Cu alte
cuvinte, gsete submulimea muchiilor care formeaz un arbore care
include toate vrfurile i care este minimizat din punct de vedere al
costului. Dac graful nu este conex, atunci algoritmul gsete un arbore
parial de cost minim pentru fiecare component conex. Algoritmul lui
Kruskal este un exemplu de algoritm greedy.
Pentru implementarea algoritmului este necesar rezolvarea urmtoarelor dou
probleme:
cum extragem muchia de cost minim
cum testm dac muchia selectat formeaz sau nu cicluri cu cele deja selectate.
Pentru a extrage minimul, o idee ar fi s sortm muchiile cresctor dup cost i s
parcurgem secvenial 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 reinem cele dou extremiti i costul muchiei).
O muchie va forma cicluri cu muchiile deja selectate dac i numai dac ntre
extremitile muchiei exist cel puin un lan.
Pentru a testa dac o muchie formeaz cicluri cu muchiile deja selectate este suficient
s testm dac extremitile muchiei se gsesc n aceeai component conex. Pentru
aceasta va trebui s inem permanent evidena componentelor conexe (arborilor) care
se formeaz.

Reprezentarea informaiilor:

n numrul de vrfuri
m numrul de muchii din graf
G graful dat, reprezentat prin lista muchiilor (un vector cu m
componente, fiecare component fiind o structur n care
reinem cele dou extremiti i costul muchiei)
A arborele parial de cost minim, reprezentat ca un vector n-1
componente n care vom reine indicii din G ai muchiilor
selectate
c vector cu n componente n care vom reine evidena
componentelor conexe (c[i] = componenta conex creia i
aparine vrful 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.


Notm cu n numrul de vrfuri din graf (n=|X|). Iniial
considerm c nici o muchie din graf nu a fost selectat, deci
fiecare vrf din graf este vrf izolat. Cu alte cuvinte, la
momentul iniial avem o pdure format din n arbori, fiecare
arbore fiind format dintr-un singur vrf. 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:Selectm o muchie de cost minim. (n cazul
nostru, de cost 1).Observai c n graful parial selectat
exist n - 1 = 4 arbori, pentru c am unificat arborii
corespunztori extremitilor muchiei selectate. Arborii
sunt: { 1, 3 }; { 2 }; { 4 }; { 5 }.
Pasul 2: Selectm din nou o muchie de cost
minim.(Costul minim fiind 1).Observai c n graful
parial 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 obine un ciclu. Selectm muchia
de cost 2.Arborii sunt: { 1, 2, 3, 4 }; { 5 }.
Pasul 4: Selectnd, n final, muchia de cost 3, obinem
un graf fr cicluri cu n-1 muchii, deci un arbore.
Cod C++:

S-ar putea să vă placă și