Documente Academic
Documente Profesional
Documente Cultură
Lucrare de laborator la
Matematica discret
A elaborat:
A verificat:
Ceban Cheorghe
Chiinu 2015
1.
Scopul lucrrii:
3.Listingul programului
//Lucrare de laborator Nr4.
//
Tema:Drum minim (Alg. Ford si Belman-Kalaba).
=
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct list
{
int info;
struct list *adr;
}list;
list* pushList(list *prev_el, list *&head_el, int inf);
list** saveList(int n, list **adi_list);
void viewList(int n, list **adi_list);
int** matInitiala(int **mat_ini, int n, int &k, list **adi_list);
void drFord(int v_fin, int **mat_ini, int mat_res[100][100], int k, int val_init, int &lun_dr, int &nr_lin, int
n);
void algBK(int **mat_ini, int val_init, int v_start, int mat_res[100][100], int n, int k, int &lun_dr, int
&nr_lin);
void afisDrFord(int mat_res[100][100], int nr_lin);
void saveDrFord(int mat_res[100][100], int nr_lin, FILE *fp);
void saveFileList(int n, list **adi_list, FILE *fp);
void afisDrBK(int mat_res[100][100], int nr_lin);
void saveDrBK(int mat_res[100][100], int nr_lin, FILE *fp);
int matDr(int n, int m, int **mat_ini);
void cleanMem(int n, list **adi_list);
int main()
{
list **adi_list;
int n, k, v_pon, v_fin, val_init, lun_dr, nr_lin, v_start, opt, ex_max;
int **mat_ini, mat_res[100][100];
FILE *fp;
printf("Introduceti numarul de virfuri: ");
scanf("%d", &n);
adi_list = saveList(n, adi_list);
min = val_init;
for(i = 0; i < n; i++)
if(i != j)
if(mat_luc[j][i] != val_init && mat_luc[n_v - 1][i] != val_init)
if(min > mat_luc[j][i] + mat_luc[n_v - 1][i])
min = mat_luc[j][i] + mat_luc[n_v - 1][i];
mat_luc[n_v][j] = min;
}
mat_luc[n_v][n - 1] = 0;
con = 1;
for(i = 0; i < n; i++)
if(mat_luc[n_v - 1][i] != mat_luc[n_v][i])
{
con = 0;
break;
}
}while(con != 1);
}else{
do
{
n_v++;
for(j = 0; j < n - 1; j++)
{
max = val_init;
for(i = 0; i < n; i++)
if(i != j)
if(mat_luc[j][i] != val_init && mat_luc[n_v - 1][i] != val_init)
if(max < mat_luc[j][i] + mat_luc[n_v - 1][i])
max = mat_luc[j][i] + mat_luc[n_v - 1][i];
mat_luc[n_v][j] = max;
}
mat_luc[n_v][n - 1] = 0;
con = 1;
for(i = 0; i < n; i++)
if(mat_luc[n_v - 1][i] != mat_luc[n_v][i])
{
con = 0;
break;
}
}while(con != 1);
}
lun_dr = mat_luc[n_v][v_start - 1];
nr_dr = 0;
nr_el = 1;
nr_lin = 0;
mat_res[nr_dr][1] = v_start;
do
{
do
{
nr_ap = 0;
pos_v = -1;
}else{
do
{
v_e = 0;
for(i = 0; i < k; i++)
{
if((vect_h[mat_ini[i][1]] - vect_h[mat_ini[i][0]]) < mat_ini[i][2])
{
vect_h[mat_ini[i][1]] = vect_h[mat_ini[i][0]] + mat_ini[i][2];
v_e++;
}
if((vect_h[mat_ini[i][1]] - vect_h[mat_ini[i][0]]) == mat_ini[i][2])
mat_ini[i][3] = 1;
else
mat_ini[i][3] = 0;
}
}while(v_e != 0);
}
lun_dr = vect_h[v_fin];
nr_dr = 0;
nr_el = 1;
nr_lin = 0;
mat_res[nr_dr][1] = v_fin;
do
{
do
{
nr_ap = 0;
pos_v = -1;
for(i = k - 1; i >= 0; i--)
if(v_fin == mat_ini[i][1] && mat_ini[i][3] == 1)
{
nr_ap++;
if(pos_v == -1)
pos_v = i;
}
if(v_fin != 1)
if(nr_ap > 1)
{
nr_el++;
mat_res[nr_dr][nr_el] = mat_ini[pos_v][0];
mat_res[nr_dr][0] = nr_el;
do
{
nr_lin++;
for(j = 0; j < mat_res[nr_dr][0]; j++)
mat_res[nr_lin][j] = mat_res[nr_dr][j];
aux = pos_v - 1;
for(i = aux; i >= 0; i--)
{
{
int i, j, k;
int mat_dr[n][n];
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
mat_dr[i][j] = 0;
for (i = 0; i < m; i++)
{
mat_dr[mat_ini[i][0] - 1][mat_ini[i][1] - 1] = 1;
}
for (k = 0; k < n; k++)
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (mat_dr[i][j] == 0)
mat_dr[i][j] = mat_dr[i][k] * mat_dr[k][j];
for (i = 0; i < n; i++)
if(mat_dr[i][i] == 1)
return 0;
return 1;
}
//Eliberarea memoriei dinamice ocupate de toate elementele programului
void cleanMem(int n, list **adi_list)
{
int i;
list *curr_el, *prev_el;
for(i = 0; i < n; i++)
{
curr_el = adi_list[i];
while(curr_el != 0)
{
//prev_el = curr_el;
prev_el = curr_el->adr;
free(curr_el);
curr_el = prev_el;
}
}
free(adi_list);
}
Concluzie: Efectuind aceasta lucrare , neam familiarizat cu algoritmul aflarii drumului minim.Acest
algoritm ne permite de a afla drumul minim intre orce doua vurfuri prin metoda lui Ford
si prin metoda lui Bellman-Kalaba.Acest algoritm se aplic pe larg n practic de exemplu laproectarea oselelor sau a diferitor tipuri de comunicaii,deci studiind teoretic acum
acest algoritm pe viitotr e posibil s-l aplicm pentru un caz real.