Documente Academic
Documente Profesional
Documente Cultură
Lucrare de laborator la
Matematica discret
A elaborat:
A verificat:
G. Marusic
Chiinu 2006
SCOPUL LUCRRII:
Studierea algoritmilor de cutare n graf i a diferitor forme de pstrare i prelucrare a datelor.
Elaborarea procedurii de cutare n adncime si largime
1.
NOTE DE CURS
Evident, este necesar ca graful s fie conex. Aceast modalitate de parcurgere a grafului (n lrgime sau postordine), care mai este
adesea numit parcurgere n ordine orizontal, realizeaz parcurgerea vrfurilor de la stnga la dreapta, nivel dup nivel.
Algoritmul pentru cazul general este analogic cu cel pentru un graf n form de arbore cu o mic modificare care const n aceea
c fiecare vrf vizitat va fi marcat pentru a exclude ciclarea algoritmului.
3. SARCINA DE BAZ
1. Elaborai procedura cutrii n adncime si largime ntr-un graf arbitrar;
2. Elaborai un program cu urmtoarele posibiliti:
introducerea grafului n calculator;
parcurgerea grafului n adncime si largime;
vizualizarea rezultatelor la display sau imprimant.
4.LISTINGUL PROGRAMULUI
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
//------------------------------------------------------------------void Prezt()
{ clrscr();
_setcursortype(_NOCURSOR);
printf("\n\n\n\n\t\t");
textcolor(3); cprintf("Lucrare de laborator Nr2 la Matematica Discreta.");
printf("\r\n\n\t\t\t");
cprintf("Cautarea in largime si adincime.");
textcolor(15);
getch();
}
//------------------------------------------------------------------void main()
{ int i,j,k,l,n,s,x,y,h;
char ch;
//------------------------------------------------------------------Prezt();
L1:static int a[30][20],b[30];
clrscr();
textcolor(15);
_setcursortype(_NORMALCURSOR);
printf("\n\t");
textcolor(3); cprintf("Introduceti numarul de virfuri ale arborelui : ");
textcolor(15);
scanf("%i",&n);
printf("\n\t");
textcolor(3); cprintf("Introduceti lista de adiacenta :\n\n ");
for(i=0;i<n;i++)
{ printf("\r%2i|",i+1);
scanf("%i",&a[i][0]);
for(j=1;j<n+1;j++)
if(a[i][j-1]!=0) scanf("%i",&a[i][j]);
else break;
}
//------------------------------------------------------------------for(i=0;i<n;i++) b[i]=i+1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(a[i][j]!=0)
if(b[a[i][j]-1]!=0&&0<a[i][j]&&a[i][j]<=n) b[a[i][j]-1]=0;
else goto l2; // Eror!
else break;
for(i=0,x=0;x<n;x++)
if(b[x]!=0) {b[0]=x+1; i++;}
if(i>1) goto l2; // Eror!
x=y=0;
printf("\n\n\r");
textcolor(3); cprintf("PARCURGEREA IN LARGIME :\n\r");
printf("\n x%d;",b[0]);
for(i=1;i<n;i++)
{ if(a[b[x]-1][y]==0) {x++; y=0; i--;}
else { b[i]=a[b[x]-1][y]; y++;
printf(" x%d;",b[i]);
if(i%15==0) printf("\n");
}
}
goto l4;
l2:printf("\n\n\t\t\t");
textcolor(4); cprintf("Eroare!");
goto l3;
//------------------------------------------------------------------l4:printf("\n\n\n\r");
textcolor(3); cprintf("PARCURGEREA IN ADINCIME:\n");
i=b[0]-1;j=s=h=0;
printf("\n x%d;",b[0]);
while(h<n)
{ k=i;
if(a[k][j]!=0)
{ printf(" x%i;",a[k][j]);
i=a[k][j]-1;
}
l1:if(a[k][j]==0)
{ if(s==0) l=k+1;
if(s==1) l=x+2;
for(x=0;x<n;x++)
for(y=0;y<n+1;y++)
{ if(a[x][y]==l&&a[x][y+1]!=0)
{ printf(" x%i;",a[x][y+1]);
i=a[x][y+1]-1;
s=0;
goto l5;
}
if(a[x][y]==l&&a[x][y+1]==0)
{ s=1;
goto l1;
}
}
}
l5:h++;
if(h%15==0) printf("\n");
}
//------------------------------------------------------------------l3:_setcursortype(_NOCURSOR);
textcolor(2); cprintf("\r\n\n\n Tastati Enter pentru a reincarca programul...\n\n");
textcolor(4); cprintf("\r
textcolor(15);
while(1)
{ ch=getch();
if(ch==27) exit(0);
if(ch==13) goto L1;
}