ALGORITMUL LUI KRUSKAL CUPRINS Descrierea algoritmului Mecanismul algoritmului

  • Slides: 12
Download presentation
ALGORITMUL LUI KRUSKAL

ALGORITMUL LUI KRUSKAL

CUPRINS Descrierea algoritmului Mecanismul algoritmului Exemplu Cod C++

CUPRINS Descrierea algoritmului Mecanismul algoritmului Exemplu Cod C++

DESCRIEREA ALGORITMULUI Algoritmul lui Kruskal, scris de Joseph Kruskal în 1956, este un algoritm

DESCRIEREA ALGORITMULUI 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. Este preferabil sa reprezentam graful ca o lista de muchii cu costul asociat lor, astfel incat sa putem ordona aceasta lista in functie de cost. Cuprins

MECANISMUL ALGORITMULUI date de intrare: un graf neorientat conex date de iesire: un arbore

MECANISMUL ALGORITMULUI date de intrare: un graf neorientat conex date de iesire: un arbore de cost minim pentru a forma arborele trebuie alese n-1 muchii(n fiind numarul de noduri al grafului) creează o mulţime de arbori, unde fiecare vârf din graf este un arbore separat creează o mulţime U’ care conţine toate muchiile din graf atât timp cât U’ este nevidă si nu s-au ales cele n-1 muchii: elimină o muchie de cost minim din U’ cu extremitatile nemarcate sau marcate diferit dacă acea muchie unifica doi arbori distincţi, atunci adaugă muchia, unificand cei doi arbori într-unul singur la sfarsit, vom avea o singura componenta conexa, care este arborele partial de cost minim al grafului. Cuprins

EXEMPLU Cuprins

EXEMPLU Cuprins

Algoritmul lui Kruskal aplicat pentru graful anterior: Initial: viz: Costul=0 Cuprins

Algoritmul lui Kruskal aplicat pentru graful anterior: Initial: viz: Costul=0 Cuprins

 Se alege muchia [2, 4] viz: Costul=0+1→costul=1; Se alege muchia [5, 6] viz:

Se alege muchia [2, 4] viz: Costul=0+1→costul=1; Se alege muchia [5, 6] viz: Costul=1+1→costul=2 Cuprins

 Se alege muchia [7, 8] viz: Costul=2+1→costul=3 Se alege muchia [2, 6] viz:

Se alege muchia [7, 8] viz: Costul=2+1→costul=3 Se alege muchia [2, 6] viz: Costul=3+2→costul=5 Se alege muchia [3, 8] viz: Costul=5+2→costul=7 Cuprins

 Se alege muchia [4, 8] viz: Costul=7+2→costul=9 Se alege muchia [1, 2] viz:

Se alege muchia [4, 8] viz: Costul=7+2→costul=9 Se alege muchia [1, 2] viz: Costul=9+3→costul=12 Cuprins

 Arborele rezultat este: Cuprins

Arborele rezultat este: Cuprins

COD C++ void kruskal() {int i, j, k; i=1; for(k=1; k<=n-1; k++) {while(viz[v[i]. x]==viz[v[i].

COD C++ void kruskal() {int i, j, k; i=1; for(k=1; k<=n-1; k++) {while(viz[v[i]. x]==viz[v[i]. y]&&viz[v[i]. x]!=0) i++; c+=v[i]. cost; cout<<v[i]. x<<" "<<v[i]. y<<endl; if(viz[v[i]. x]+viz[v[i]. y]==0) viz[v[i]. x]=viz[v[i]. y]=v[i]. x; else if(viz[v[i]. x]*viz[v[i]. y]==0) viz[v[i]. x]=viz[v[i]. y]=viz[v[i]. x]+viz[v[i]. y]; else {for(j=1; j<=n; j++) if(viz[j]==viz[v[i]. x]&&j!=v[i]. x) viz[j]=viz[v[i]. y]; viz[v[i]. x]=viz[v[i]. y]; } i++; } cout<<c; } Cuprins

Realizatori: Lupes Paula Pascaru Georgiana

Realizatori: Lupes Paula Pascaru Georgiana