170 likes | 407 Views
Algoritmul lui Kruskal. Cuprins. Descrierea algoritmului Mecanismul algoritmului Exemplu Cod C++. Descrierea algoritmului.
E N D
Cuprins • Descrierea algoritmului • Mecanismul algoritmului • Exemplu • Cod C++
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 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
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: Costul=1+1→costul=2 Cuprins
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: Costul=9+3→costul=12 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].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