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.

640
60
600

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.

640
60

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.

Exemplu:
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
21
1
1
11
1

3
1 1
14
1

3
1
1
1
5
1

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++: