Documente Academic
Documente Profesional
Documente Cultură
RAPORT
Lucrare de laborator nr.3
Analiza,proiectarea algoritmilor
Tema: Algoritmi greedy.
A efectuat:
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;
}
}