Sunteți pe pagina 1din 8

MINISTERUL EDUCAIEI REPUBLICII MOLDOVA

UNIVERSITATEA TEHNIC A MOLDOVEI


Facultatea Calculatoare, Informatic i Microelectronic
Specialitatea :Tehnologii informationale

RAPORT
Lucrare de laborator nr.3
Analiza,proiectarea algoritmilor
Tema: Algoritmi greedy.

A efectuat:

st. gr. TI-133

A verificat:

Urmasnchi Mihail
M. Catruc

Chisinau 2014

Scopul lucrrii:
1. Studierea tehnicii greedy.
2. Analiza i implementarea algoritmilor greedy.
Algoritmul Kruskal:
KRUSKAL(V, E)
A{}
Set A will ultimately contains the edges of the MST
for each vertex v in V
do MAKE-SET(v)
sort E into nondecreasing order by weight
for each (u, v) taken from the sorted list
do if FIND-SET(u) = FIND-SET(v)
then A A {(u, v)}
UNION(u, v)
return A
Codul programului:
#include<iostream>
#include<stdlib.h>
using namespace std;
int nrConexiuni,nrVirfuri;
int MA[1000][3];
int fin[1000];
int mid[1000][100];
int q=0;
void sortare(){
int temp[3];
for(int i=0;i<q;i++){
for(int j=0;j<q-1;j++){
if(MA[j][2]>MA[j+1][2]){
temp[0]=MA[j][0];
temp[1]=MA[j][1];
temp[2]=MA[j][2];
MA[j][0]=MA[j+1][0];
MA[j][1]=MA[j+1][1];
MA[j][2]=MA[j+1][2];

MA[j+1][0]=temp[0];
MA[j+1][1]=temp[1];
MA[j+1][2]=temp[2];
}
}
}
}
void control(){
for(int i=1;i<nrConexiuni;i++){
if(mid[i][1]!=mid[i+1][1]){
cout<<"\nsfirsitul iteratiilor !\n";
}
}
}
int k=0;
void krusk(){
int nr=1;
k=0;
for(int i=0;i<q;i++){
if(mid[MA[i][0]][1]==9 && mid[MA[i][1]][1]==9){
mid[MA[i][0]][1]=nr;
mid[MA[i][1]][1]=nr;
fin[k++]=i;
nr++;
}
else if(mid[MA[i][0]][1]!=9 && mid[MA[i][1]][1]==9){
mid[MA[i][1]][1]=mid[MA[i][0]][1];
fin[k++]=i;
}
else if(mid[MA[i][0]][1]==9 && mid[MA[i][1]][1]!=9){
mid[MA[i][0]][1]=mid[MA[i][1]][1];
fin[k++]=i;
}
else if(mid[MA[i][0]][1]!=9 && mid[MA[i][1]][1]!=9){
if(mid[MA[i][0]][1] != mid[MA[i][1]][1]){
fin[k++]=i;
int r=mid[MA[i][1]][1];
for(int s=0;s<=nrConexiuni+5;s++){
if(mid[s][1]==r){

mid[s][1]=mid[MA[i][0]][1];
}
}
}
if(mid[MA[i][0]][1] == mid[MA[i][1]][1]){
cout<<"";
}
}
cout<<"\nnumarul iteratiei : "<<i;
control();
}}
int main(){
cout<<"Introduceti numarul de virfuri a grafului : ";
cin>>nrConexiuni;
for(int i=0;i<nrConexiuni-1;i++){
for(int j=i+1;j<i+2;j++){
for(int j=i+1;j<nrConexiuni;j++){
if(j%2==0){
MA[q][0]=i+1;
MA[q][1]=j+1;
MA[q++][2]=rand()%99;
cout<<MA[q-1][0]<<","<<MA[q-1][1]<<"-"<<MA[q-1][2]<<endl;
}
}
}
}
/*
MA[q][0]=1;
MA[q][1]=nrConexiuni;
MA[q++][2]=rand()%99;
*/
cout<<MA[q-1][0]<<","<<MA[q-1][1]<<"-"<<MA[q-1][2]<<endl;
nrVirfuri=q-1;
for(int i=1;i<=nrVirfuri+5;i++){
mid[i][0]=i;
mid[i-1][1]=9;
}
cout<<endl;

sortare();
for(int i=0;i<q;i++){
cout<<MA[i][0]<<","<<MA[i][1]<<"-"<<MA[i][2]<<endl;
}
krusk();
cout<<endl;
for(int i=0;i<k;i++){
cout<<i+1<<" "<<MA[fin[i]][0]<<","<<MA[fin[i]][1]<<" = "<<MA[fin[i]]
[2]<<endl;
}}
Algoritmul Prim
Algorithm
1) Create a set mstSet that keeps track of vertices already included in MST.
2) Assign a key value to all vertices in the input graph. Initialize all key
values as INFINITE. Assign key value as 0 for the first vertex so that it is
picked first.
3) While mstSet doesnt include all vertices
.a) Pick a vertex u which is not there in mstSet and has minimum key
value.
.b) Include u to mstSet.
.c) Update key value of all adjacent vertices of u. To update the key
values, iterate through all adjacent vertices. For every adjacent vertex v, if
weight of edge u-v is less than the previous key value of v, update the key
value as weight of u-v

Codul programului:
#include<iostream>
#include<stdlib.h>
using namespace std;
int main(void)

{
double t1,t2;
int C[200][200];
int n,i,j,k,min;
int vecin[200],mincost[200],A[200];
cout<<" Nr.Virfuri: ";
cin>>n;
cout<<endl<<" valorile mukiilor:"<<endl;
for(i=0;i<n-1;i++){
for(j=i+1;j<i+3;j++){
// if(j%2==0){
cout<<" "<<i+1<<","<<j+1<<"-";
C[i][j]=rand()%99;
cout<<C[i][j]<<endl;
if(C[i][j]==0)
C[i][j]=9999;
C[j][i]=C[i][j];
//}
}
C[i][i]=0;
}
//////////////
/*
cout<<" "<<1<<","<<n<<"-";
C[0][n-1]=rand()%99;
cout<<C[0][n-1]<<endl;
if(C[n-1][0]==0)
C[i][j]=9999;
C[0][n-1]=C[n-1][0];
*/
////////////////
for(i=0;i<n;i++){
vecin[i]=1;
mincost[i]=C[i][0];
}
// t1=clock();
cout<<endl;
int sortat,contor=0;
for(int gredy=1;gredy<n;gredy++){
min=9999;

for (j=0;j<n;j++)
if(mincost[j]>0 && mincost[j]<min){
min=mincost[j];
k=j;
}
cout<<" "<<vecin[k]<<","<<k+1<<" \n";
if(gredy==1){
A[0]=vecin[k];
A[1]=k+1;
i=2;
}
else{
int a=1,b=1;
for(j=0;j<i;j++){
if(A[j]==vecin[k])
a=0;
if(A[j]==k+1)
b=0;
}
if(a==1)
A[i++]=vecin[k];
if(b==1)
A[i++]=k+1;
}do{
contor++;
sortat=1;
for(j=0;j<i-1;j++)
if(A[j]>A[j+1]){
int temp=A[j];
A[j]=A[j+1];
A[j+1]=temp;
sortat=0;
}
}while(!sortat);
mincost[k]=0;
for(j=0;j<n;j++)
if(C[k][j]<mincost[j]){
mincost[j]=C[k][j];
vecin[j]=k+1;
}
}

cout<<"\n Iteratii : "<<contor;}


Rezultatele testarii:

Concluzie: Realizind laboratorul dat am obinut deprinderi noi n programarea


algoritmelor Greddy. Dup rezultatele obtinute se observa ca algoritmul kruscal
este considerabil mai efectiv dect algoritmul prim deoarece programind
algoritmul prim am folosit tabloul bidimensional dar calculind complexitatea dup
pseudocod se observa ca algoritmul prim are un timp mai efectiv dect algoritmul
kruscal.

S-ar putea să vă placă și