Академический Документы
Профессиональный Документы
Культура Документы
Lucrare de laborator 3
la
Analiza si Proiectarea Algoritmilor
Efectuat de
St.gr.
Caisin Ion
FAF-091
Chiinu 2010
Proprietatea 1. n algoritmul lui Kruskal, la fiecare pas, graful parial <V, A> formeaz o pdure de
componente conexe, n care fiecare component conex este la rndul ei un arbore parial de cost minim pentru
vrfurile pe care le conecteaz. n final, se obine arborele parial de cost minim al grafului G.
Pentru a implementa algoritmul, trebuie s putem manipula submulimile formate din vrfurile componentelor
conexe. Folosim pentru aceasta o structura de mulimi disjuncte i procedurile de tip find i merge (Seciunea 3.5). n
acest caz, este preferabil s reprezentm graful c o lista de muchii cu costul asociat lor, astfel nct s putem ordona
aceast list n funcie de cost. Iat algoritmul:
Pentru un graf cu n vrfuri i m muchii, presupunnd c se folosesc procedurile find3 i merge3, numrul de
operaii pentru cazul cel mai nefavorabil este n:
O(m
log m) pentru a sorta muchiile. Deoarece m n(n1)/2, rezulta O(m log m) O(m log n). Mai mult, graful fiind
conex, din n1 m rezulta i O(m log n) O(m log m), deci O(m log m) = O(m log n).
O(n)
Deci, pentru cazul cel mai nefavorabil, algoritmul lui Kruskal necesit un timp n O(m log n).
O alt variant este s pstram muchiile ntr-un min-heap. Obinem astfel un nou algoritm, n care iniializarea
se face ntr-un timp n O(m), iar fiecare din cele n1 extrageri ale unei muchii minime se face ntr-un timp n
O(log m) = O(log n). Pentru cazul cel mai nefavorabil, ordinul timpului rmne acelai cu cel al vechiului algoritm.
Avantajul folosirii min-heap-ului apare atunci cnd arborele parial de cost minim este gsit destul de repede i un
numr considerabil de muchii rmn netestate. n astfel de situaii, algoritmul vechi pierde timp, sortnd n mod inutil
i aceste muchii.
Source code
Algoritmul Kruskal
#include<stdio.h>
#include<conio.h>
#include<process.h>
#include<iostream.h>
#include <time.h>
#include <dos.h>
struct Graf
{
int x;
int y;
int cost;
}*arc,*virf;
int nv,na,*set,*nod,*h,**mad;
void introd()
{
int i,j;
cout<<"\n|V| = ";
cin>>nv;nod=new int[nv];set=new int[nv];h=new int[nv];
for(i=0;i<nv;i++) { nod[i]=i; set[i]=i; h[i]=0;}
cout<<"\\n\t\t nGive < A > = "; cin>>na; arc=new Graf[na];
cout<<"\n\n\t Give x, y, and price :\n";
for(i=0;i<na;i++)
{ cin>>arc[i].x;arc[i].x-=1; cin>>arc[i].y;arc[i].y-=1; cin>>arc[i].cost; }
}
void merge(int a,int b)
{ if(a!=b) { if(h[a]==h[b]) {
h[a]++;set[b]=a;
}
else {if(h[a]>h[b]) set[b]=a;
else set[a]=b; }}}
int gaseste(int x)
{int i,j,r=x; while(set[r]!=r) r=set[r]; i=x;
while(i!=r) { j=set[i]; set[i]=r; i=j; }
return r;}
void SortCost(int &count)
{ int i,j; Graf tmp;
for(i=0;i<na-1;i++){
count++; for(j=i+1;j<na;j++) {
count++; if(arc[i].cost>arc[j].cost)
{tmp=arc[j]; arc[j]=arc[i]; arc[i]=tmp;}}}}
void Kruskal()
{
int count=0; SortCost(count); virf=new Graf[nv-1];
Graf tmp; int j=0,ucomp,vcomp;
for(int i=0;i<nv-1;i++)
{count++; do { count++;
tmp=arc[j]; ucomp=gaseste(arc[j].x);
vcomp=gaseste(arc[j].y); if(ucomp!=vcomp)
{ merge(ucomp,vcomp); virf[i]=tmp; break;}
j++; } while (1); }
cout<<"\n\n\t\t NUmber of iteration is : "<<count<<"\n\n";
}
void AfisVirf()
{
cout<<"\n\nVirfurile prelucrate sunt : {";
for(int i=0;i<nv;i++)
cout<<nod[i]+1<<",";
printf("%c}",8);
}
void AfisMuchii()
{
cout<<"\n\t Muchiile ce participa in algoritmul Kruskal sunt :\n";
for(int i=0;i<nv-1;i++)
cout<<"\n("<<virf[i].x+1<<","<<virf[i].y+1<<"); cu costul = "<<virf[i].cost;
}
void main()
{
clrscr();
cout<<"\n\t\tALGORITMUL KRUSKAL\n";
int L=0;
introd();
clock_t start,end;
start=clock();
Kruskal();
end=clock();
printf("Timpul de executie este : %.2f\n",(end-start)/CLK_TCK);
AfisMuchii();AfisVirf();
for(int i=0;i<nv-1;i++)
L=L+virf[i].cost;
cout<<"\n\nLmin = "<<L;
getch();
}
#include<process.h>
#include<iostream.h>
#include<time.h>
#include<dos.h>
struct El
{int val; int mark;}*d;
struct Graf
{int x,y,c; Graf(){x=0;y=0;}
Graf(int x,int y)
{this->x=x;this->y=y;}}*arc;
int nv,na,*s,**matr;
void introd()
{
int i,j,k; cout<<"\n|V| = "; cin>>nv;
cout<<"\n|A| = "; cin>>na; arc=new Graf[na];
cout<<"\nDati x, y, costul :\n";
for(i=0;i<na;i++){
cin>>arc[i].x;arc[i].x-=1;
cin>>arc[i].y;arc[i].y-=1;
cin>>arc[i].c;}}
void Big()
{int i,j; matr=new int*[nv];
for(i=0;i<nv;i++)
{matr[i]=new int[nv];
for(j=0;j<nv;j++)
matr[i][j]=999;
}
for(i=0;i<na;i++)
matr[arc[i].x][arc[i].y]=arc[i].c;
}
void init()
{int i;s=new int[nv];d=new El[nv];
for(i=0;i<nv;i++)
{d[i].val=matr[0][i];
d[i].mark=0;s[i]=-1;}d[0].mark=1;s[0]=0;}
void Dijkstra(int &count)
{int i,j,k,min,pmin,add;
init();for(i=1;i<nv;i++)
{min=999;for(j=1;j<nv;j++){count++;
if(d[i].val<min&&d[i].mark==0)
{min=d[i].val;
pmin=i;}}add=min;
s[i]=pmin;d[pmin].mark=1;
for(j=1;j<nv;j++){count++;
if((matr[i][j]+add)<d[j].val)
d[j].val=(matr[pmin][j]+add);}}cout<<"\n\nD = ["; for(i=1;i<nv;i++)
{ cout<<" "<<d[i].val;}cout<<" ]";}
void main()
{clrscr();cout<<"\n\t\tALGORITMUL DIJKSTRA\n";
int count=0; introd();Big();
clock_t start,end; start=clock(); Dijkstra(count);
end=clock(); cout<<"\n\nNr de iteratii este : "<<count;
printf("\n\nTimpul de executie este : %.2f",(end-start)/CLK_TCK);getch();}
end=clock();
cout<<"\n\nNr de iteratii este : "<<count;
printf("\n\nTimpul de executie este : %.2f",(end-start)/CLK_TCK);
getch();}
Concluzie :
Efectuind lucrarea de laborator am studiat algoritmii greedy si anume algoritmii :
Kruskal, Prim si Dijkstra. Algoritmii Kruskal si Prim ne dau posibilitatea sa construim arborele
de cost minim. Algoritmul Dijkstra ne da posibilitatea sa determinam drumurile minimale pina
la fiecare virf in parte. Implementind si analizind algoritmul Kruskal si Prim am ajuns la
concluzia ca acesti algoritmi sunt rapizi si rezulta ca sunt algoritmi eficienti si foarte buni
pentru rezolvarea problemei de construire a arborelui de cost minim. Algoritmul Dijkstra de
asemenea este un algoritm foarte eficient. Timpul de executie necesar pentru rezolvarea sarcinei
este minimal. Am folosit limbajul C++ pentru constriuirea codului sursa pentru program , am
intilnit greutati la structure de date , dar pina in sfirsit programul a fost facut efficient.
10