SlideShare a Scribd company logo
1 of 11
Download to read offline
ALGORITMUL LUI KRUSKAL
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

More Related Content

More from Ion Balan

Partidul Politic Partidul Nostru - Lidia Cornescu
Partidul Politic Partidul Nostru - Lidia CornescuPartidul Politic Partidul Nostru - Lidia Cornescu
Partidul Politic Partidul Nostru - Lidia CornescuIon Balan
 
Partidul Socialiştilor din Republica Moldova - Mihail Patraş
Partidul Socialiştilor din Republica Moldova - Mihail PatraşPartidul Socialiştilor din Republica Moldova - Mihail Patraş
Partidul Socialiştilor din Republica Moldova - Mihail PatraşIon Balan
 
Partidul Liberal Democrat din Moldova - Andrei Ciubăr
Partidul Liberal Democrat din Moldova - Andrei CiubărPartidul Liberal Democrat din Moldova - Andrei Ciubăr
Partidul Liberal Democrat din Moldova - Andrei CiubărIon Balan
 
Partidul Comuniştilor din Republica Moldova - Patraş Valeriu
Partidul Comuniştilor din Republica Moldova - Patraş ValeriuPartidul Comuniştilor din Republica Moldova - Patraş Valeriu
Partidul Comuniştilor din Republica Moldova - Patraş ValeriuIon Balan
 
Partidul Democrat din Moldova- Simion Zdraguş
Partidul Democrat din Moldova- Simion ZdraguşPartidul Democrat din Moldova- Simion Zdraguş
Partidul Democrat din Moldova- Simion ZdraguşIon Balan
 

More from Ion Balan (7)

Partidul Politic Partidul Nostru - Lidia Cornescu
Partidul Politic Partidul Nostru - Lidia CornescuPartidul Politic Partidul Nostru - Lidia Cornescu
Partidul Politic Partidul Nostru - Lidia Cornescu
 
Pn
PnPn
Pn
 
Partidul Socialiştilor din Republica Moldova - Mihail Patraş
Partidul Socialiştilor din Republica Moldova - Mihail PatraşPartidul Socialiştilor din Republica Moldova - Mihail Patraş
Partidul Socialiştilor din Republica Moldova - Mihail Patraş
 
Partidul Liberal Democrat din Moldova - Andrei Ciubăr
Partidul Liberal Democrat din Moldova - Andrei CiubărPartidul Liberal Democrat din Moldova - Andrei Ciubăr
Partidul Liberal Democrat din Moldova - Andrei Ciubăr
 
Partidul Comuniştilor din Republica Moldova - Patraş Valeriu
Partidul Comuniştilor din Republica Moldova - Patraş ValeriuPartidul Comuniştilor din Republica Moldova - Patraş Valeriu
Partidul Comuniştilor din Republica Moldova - Patraş Valeriu
 
Partidul Democrat din Moldova- Simion Zdraguş
Partidul Democrat din Moldova- Simion ZdraguşPartidul Democrat din Moldova- Simion Zdraguş
Partidul Democrat din Moldova- Simion Zdraguş
 
Prima plata
Prima plataPrima plata
Prima plata
 

kruskal-arborele-partial-de-cost-minim_compress.pdf

  • 2. CUPRINS  Descrierea algoritmului  Mecanismul algoritmului  Exemplu  Cod C++
  • 3. 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
  • 4. 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
  • 6. Algoritmul lui Kruskal aplicat pentru graful anterior:  Initial: viz: Costul=0 Cuprins
  • 7.  Se alege muchia [2,4] viz: Costul=0+1→costul=1;  Se alege muchia [5,6] viz: Costul=1+1→costul=2 Cuprins
  • 8.  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
  • 9.  Se alege muchia [4,8] viz: Costul=7+2→costul=9  Se alege muchia [1,2] viz: Costul=9+3→costul=12 Cuprins
  • 10.  Arborele rezultat este: Cuprins
  • 11. 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