Sunteți pe pagina 1din 4

Universitatea Tehnică a Moldovei

Facultatea Calculatoare Informatică și Microelectronică


Departamentul Ingineria Software și Automatică

RAPORT
la lucrarea de laborator nr. 3

la MD

Tema: Algoritmul de căutare în lărgime.

A efectuat: st. gr. TI-224 Cojucari Dumitru

A verificat: Melnic Vladimir

Chişinău 2023
Scopul lucrării
1. Studierea algoritmului de căutare în lărgime;
2. Elaborarea programului de căutare în lărgime.

Problema
- 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:
o ➢ introducerea grafului în memoria calculator;
o ➢ parcurgerea grafului în lărgime;
o ➢ vizualizarea rezultatelor la display;.
Rezolvare:

#include <stdio.h>
#include <stdbool.h>

void print(int a[][100], int n){


    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
           printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

void parcurgere_latime(int a[][100], int n){


    int l[100];
    bool visitat[100] = {0};
    int poz_1 = 0, poz_ult = 0;
    int pornire, nod_current;
    printf("Introdu startul: ");
    scanf("%d", &pornire);
    l[poz_ult++] = pornire;  // Adaugam nodul de pornire in coada si procesam
    visitat[pornire] = true;
    while(poz_1 != poz_ult){
        nod_current = l[poz_1++];  // Extragere nod din coada si actualizare prima
pozitie din coada
        printf("%d ", nod_current);
        for(int j =1; j<=n; j++){
            if(a[nod_current][j] == 1 && visitat[j] == false){
                l[poz_ult++] = j;  // Adaugam nodul vecin in coada si actualizam ultima
pozitie din coada
                visitat[j] = true;
            }
        }
    }
}

int main(){
    int a[100][100] = {0};
    int n, e, i, j, sursa, destinatie;
    printf("Introduce nr de noduri si muchii\n");
    scanf("%d %d", &n, &e);
    printf("Introduce nodurile :\n");
    for(i=0; i<e; i++){
        scanf("%d %d", &sursa, &destinatie);
        a[sursa][destinatie] = 1;
    }
    print(a, n);
    printf("\n");
    parcurgere_latime(a, n);
    return 0;
}

Concluzie:

Parcurgerea în lățime a unui arbore sau graf constă în vizitarea tuturor nodurilor în
ordinea distanței lor față de nodul de pornire. Începând de la nodul de pornire, se
vizitează toți vecinii săi și apoi toți vecinii acestora și tot așa, până când toate nodurile
sunt vizitate.

Diferența principală dintre parcurgerea în lățime a unui arbore și a unui graf arbitrar
constă în modul în care sunt reprezentate. Un arbore este un graf conex fără cicluri, în
timp ce un graf arbitrar poate conține cicluri și nu trebuie să fie conex. În parcurgerea în
lățime a unui arbore, se poate începe de la orice nod și se poate utiliza o simplă listă ca
structură de date pentru a reține nodurile de procesat, în timp ce în parcurgerea în lățime
a unui graf arbitrar trebuie să se specifice un nod de pornire și se utilizează o coadă
pentru a reține nodurile de procesat.

Structurile de date utilizate în algoritmul de căutare în lățime sunt o coadă și un vector de


vizitate. Coada este utilizată pentru a reține nodurile care urmează să fie procesate, iar
vectorul de vizitate este utilizat pentru a marca nodurile care au fost deja vizitate.
Exemplu de algoritm de căutare în lățime:

a) Se începe de la un nod de pornire dat, care se adaugă în coada de procesat și se


marchează ca vizitat.
b) Se extrage primul nod din coadă și se procesează.
c) Pentru fiecare nod adiacent care nu a fost vizitat încă, se adaugă în coadă și se
marchează ca vizitat.
d) Se repetă pașii b și c până când coada este goală.
e) Toate nodurile vizitate în ordinea în care au fost procesate reprezintă parcurgerea în
lățime a grafului/arbor

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