Matematica Discreta - Parcurgerea grafului in largime si adincime

1.    SCOPUL LUCRĂRII:
-Studierea algoritmilor de căutare în graf şi a diferitor forme de păstrare şi prelucrare a datelor.
-Elaborarea procedurii de căutare în adâncime.

-Studierea algoritmului de căutare în lărgime;

-Elaborarea programului de căutare în lărgime

2.SARCINA DE BAZĂ
1.     Elaboraţi procedura care va realiza algoritmul de parcurgere a grafului în lărgime;
2.     Folosind procedurile din lucrările precedente, elaboraţi programul care va permite:
* introducerea grafului în calculator;
* parcurgerea grafului în lărgime;
3.Elaboraţi procedura căutării în adâncime într-un graf arbitrar;
4.Elaboraţi un program cu următoarele posibilităţi:
Ø introducerea grafului în calculator,
Ø parcurgerea grafului în adâncime,
NOTE DE CURS

Structuri de date: liste

Fiecare tip de listă defineşte o mulţime de şiruri finite de elemente de tipul declarat. Numărul de elemente care se numeşte lungimea listei poate varia pentru diferite liste de acelaşi tip. Lista care nu conţine nici un element se va numi vidă. Pentru listă sunt definite noţiunile începutul, sfârşitul listei şi respectiv primul şi ultimul element, de asemenea elementul curent ca şi predecesorul şi succesorul elementului curent. Element curent se numeşte acel unic element care este accesibil la momentul dat.

Structuri de date : fire de aşteptare

Firele de aşteptare (FA, rând, coadă, şir de aşteptare) se vor folosi pentru a realiza algoritmul de prelucrare a elementelor listei în conformitate cu care elementele vor fi eliminate din listă în ordinea în care au fost incluse în ea (primul sosit - primul servit).
Operaţiile de bază cu firele de aşteptare:
Ø Formarea unui FA vid;
Ø Verificare dacă FA nu este vid;
Ø Alegerea primului element cu eliminarea lui din FA;
Ø Introducerea unei valori noi în calitate de ultim element al FA.

Structuri de date: stive

Stiva se utilizează pentru a realiza algoritmul de prelucrare a elementelor după principiul "ultimul sosit - primul prelucrat" (LIFO).
Operaţiile de bază cu stivele sunt următoarele:
Ø Formarea unei stive vide;
Ø Verificare la vid;
Ø Alegerea elementului din topul stivei cu sau fără eliminare;
Ø Introducerea unui element nou în topul stivei.

Structuri de date - arbori

Se va defini o mulţime de structuri fiecare din care va consta dintr-un obiect de bază numit vârf sau rădăcina arborelui dat şi o listă de elemente din mulţimea definită, care (elementele) se vor numi subarbori ai arborelui dat. Arborele pentru care lista subarborilor este vidă se va numi arbore trivial, iar rădăcina lui - frunză.
Rădăcina arborelui se va numi tatăl vârfurilor care servesc drept rădăcini pentru subarbori; aceste vârfuri se vor mai numi copiii rădăcinii arborelui: rădăcina primului subarbore se va numi fiul cel mai mare, iar rădăcina fiecărui subarbore următor în listă se va numi frate.
Operaţiile de bază pentru arbori vor fi:
Ø Formarea unui arbore trivial;
Ø Alegerea sau înlocuirea rădăcinii arborelui;
Ø Alegerea sau înlocuirea listei rădăcinilor subarborilor;
Ø Operaţiile de bază care sunt valabile pentru liste.

Listingul programului:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#define N 20
#define M 20



typedef struct nod{
                          int v;
                           struct nod *next;
                           }NOD;
NOD *c,*h[20],*p;




void int_list_de_adiac(int n)
{int i,j;
clrscr();
printf("Introdu elementele listei:\n");
for(i=0;i<n;i++){
h[i]=(NOD*)malloc(sizeof(*h));
c=h[i];

printf("%d | ",i+1);
while(1){
scanf("%d", &c->v);
if(c->v==0){
c->next=NULL;
break;
}
p=(NOD*)malloc(sizeof(*p));
c->next=p;
c=p;}
}
}



void afis_list_de_adiac(int n)
{
int i;
clrscr();
printf("Lista de adiacenta este:\n");
for (i=0;i<n;i++){
c=h[i];
printf("%d | ",i+1);
while(1){
printf("%3d",c->v);
if(c->v==0)break;
c=c->next;
}
printf("\n");
}
getch();
}



void parc_graf_in_adinc(int n)
{int i,f,u,m;
NOD *r,*g,*a,*t[20];
clrscr();
u=0;
for(i=0;i<n;i++)
t[i]=h[i];
g=(NOD*)malloc(sizeof(NOD));
textcolor(12);
printf("\n Introduceti radacina: ");
scanf("%d",&f);
g->v=f;
g->next=NULL;
a=g;
printf("%d",f);
r=t[f-1];
while(g!=NULL)
{
if(r->v!=0){r=t[f-1];
if(r->v!=0){
printf("\t %d",r->v);
u++;
t[f-1]=t[f-1]->next;
f=r->v;
g=(NOD*)malloc(sizeof(NOD));
g->v=r->v;
g->next=a;
a=g;}}
else if(r->v==0){
a=a->next;
free(g);
g=a;
f=a->v;
r=t[f-1];
}
}
getch();}



void parc_graf_in_latim(int n)
{int i=0,r;
NOD *c,*t,*o,*l;
clrscr();
t=(NOD*)malloc(sizeof(NOD));
textcolor(16);
printf("Inroduceti radacina: ");
scanf("%d",&r);
printf("%d",r);
t->v=r;
t->next=NULL;
c=t;
l=t;
while((t!=0)&&(c!=0)){
if(i==0){o=h[r-1];i=1;}
if(o->v!=0){
printf("\t%d",o->v);
t=(NOD*)malloc(sizeof(NOD));
t->v=o->v;
t->next=NULL;
l->next=t;
l=t;
o=o->next;}
else if(o->v==0) {o=c->next;free(c);c=o;
r=c->v;i=0;}
}
getch();
}


void main()
{
int n,m;
char d;

clrscr();
printf("Introduceti numarul de virfuri ale grafului -  ");
scanf("%d",&n);
printf("Introduceti numarul de arcuri ale grafului -  ");
scanf("%d",&m);
while(1){

clrscr();
   printf ("\t\t\tMENIU  \n");
  printf("\t1  - Introducerea listei de adiacenta. \n ");
  printf("\t2  - Afisarea listei de adiacenta.\n ");
  printf("\t3  - Parcurgerea grafului in adincime \n");
  printf("\t4  - Parcurgerea grafului in latime  \n" );
  printf("\t0  - Iesire \n");
  textcolor(GREEN);
  cprintf("\n Comanda: ");
  d=getch();
switch(d){
case '1':{  int_list_de_adiac(n);  break;}
case '2':{ afis_list_de_adiac(n);break;}
case '3':{parc_graf_in_adinc(n);break;}
case '4':{parc_graf_in_latim(n);break;}
case '0':{exit(0);break;}
}}}


Concluzie:
 La lucrarea de laborator cu tema:” Parcurgerea grafului in largime si adincime.”,am studiat algoritmii de căutare în graf şi diferite forme de păstrare şi prelucrare a datelor, am elaborat proceduri de căutare în adâncime si  lărgime.