120 likes | 445 Views
Algoritmul lui Kruskal. Proiect realizat de: Capota Alina si Predescu Iulia. Cuprins :. Descrierea algoritmului Implementarea algoritmului Aplicatie practica Exemplu Programul in C++. Descrierea Algorimului.
E N D
Algoritmul lui Kruskal Proiect realizat de: Capota Alina si Predescu Iulia
Cuprins: • Descriereaalgoritmului • Implementareaalgoritmului • Aplicatiepractica • Exemplu • Programul in C++
DescriereaAlgorimului • 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.
Implementarea algoritmului Pentru implementarea algoritmului este necesară rezolvarea următoarelor două probleme: • – cum extragem muchia de cost minim • – cum testăm dacă muchia selectată formeazăsau nu cicluri cu cele deja selectate. Pentru a extrage minimul, o idee ar fi să sortăm muchiile crescător după cost şi să parcurgem secvenţial 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 reţinem cele două extremităţi şi costul muchiei). O muchie va forma cicluri cu muchiile deja selectate dacă şi numai dacă între extremităţile muchiei există cel puţin un lanţ. Pentru a testa dacă o muchie formează cicluri cu muchiile deja selectate este suficient să testăm dacă extremităţile muchiei se găsesc în aceeaşi componentă conexă. Pentru aceasta va trebui să ţinem permanent evidenţa componentelor conexe (arborilor) care se formează.
Reprezentarea informaţiilor: n – numărul de vârfuri m – numărul de muchii din graf G – graful dat, reprezentat prin lista muchiilor (un vector cu m componente, fiecare componentă fiind o structură în care reţinem cele două extremităţi şi costul muchiei) A – arborele parţial de cost minim, reprezentat ca un vector n-1 componente în care vom reţine indicii din G ai muchiilor selectate c – vector cu n componente în care vom reţine evidenţa componentelor conexe (c[i] = componenta conexă căreia îi aparţine vârful i)
AplicatiePractica • Trebuiesaconectam 3 orase la o reteatelefonica: Bucuresti, Timisoara siArad. • Necesarcablu: 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 legaturisuntsuficiente, deoarecesemnalul electric circulasuficient de rapid ca un abonat din Timisoara care dorestesavorbeasca cu unul din Arad (de exemplu) sa nu-sideaseamaca nu existalegaturadirectaintre Timisoara si Arad sicaapelulsauesterutatprinBucuresti. • Din punctul de vedere al necesarului de cablu, lucrurile nu maistau la fel. • Conteazafoartemult care legaturivor fi realizatesi care nu. • Celmaiieftinar fi saalegemlegaturile Arad – Timisoara si Timisoara – Bucurestisisaevitamlegatura Arad - Bucuresti, necesarul de cabluajungand in acestcaz la 660 km; aceastaestesituatia optima – sau “acoperirea minima” a retelei.
Exemplu: • Notăm cu n numărul de vârfuri din graf (n=|X|). Iniţial considerăm că nici o muchie din graf nu a fost selectată, deci fiecare vârf din graf este vârf izolat. Cu alte cuvinte, la momentul iniţial avem o pădure formată din n arbori, fiecare arbore fiind format dintr-un singur vârf. 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. 3 111 2 111 1 2 3 1 111 4 1 111 1 4 111 5
Pasul 1:Selectăm o muchie de cost minim. (În cazul nostru, de cost 1).Observaţi că în graful parţial selectat există n - 1 = 4 arbori, pentru că am unificat arborii corespunzători extremităţilor muchiei selectate. Arborii sunt: { 1, 3 }; { 2 }; { 4 }; { 5 }. • Pasul 2: Selectăm din nou o muchie de cost minim.(Costul minim fiind 1).Observaţi că în graful parţial 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 obţine un ciclu. Selectăm muchia de cost 2.Arborii sunt: { 1, 2, 3, 4 }; { 5 }. • Pasul 4: Selectând, în final, muchia de cost 3, obţinem un graf fără cicluri cu n-1 muchii, deci un arbore.
Cod C++: #include<fstream>#include<iostream>usingnamespacestd;int n,nr_muchii,k=1,T[50],H[50],M[3][50];void citire(){ifstream f("graf.in");f>>n;while(f>>M[0][k]>>M[1][k]>>M[2][k])k++;}intArb(int nod){while(T[nod])nod=T[nod];returnnod;}intmain(){ citire(); k=1; do {while(Arb(M[0][k])==Arb(M[1][k]))k++; nr_muchii++;cout<<M[0][k]<<" "<<M[1][k]<<" "<<M[2][k]<<endl;if(H[M[0][k]]== H[M[1][k]]) {T[M[0][k]]==M[1][k]; H[M[1][k]]++; }elseif(H[M[0][k]<H[M[1][k]]) T[M[0][k]]=M[1][k];else T[M[1][k]]=M[0][k];k++; }while(nr_muchii<n-1);return 0;}