Cod sursa(job #3251004)

Utilizator martavacaruVacaru Marta-Patricia martavacaru Data 24 octombrie 2024 15:40:13
Problema BFS - Parcurgere in latime Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.4 kb
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
#include <algorithm>

using namespace std;

// Funcția pentru construirea listei de adiacență
void construiesteLista(const string& numeFisier, vector<vector<int>>& lista, int& n) {
    ifstream f(numeFisier);
    if (!f) {
        cout << "Eroare la deschiderea fișierului!" << endl;
        return;
    }

    int m;  // Numărul de muchii
    f >> n >> m;  // Citim numărul de noduri și muchii

    lista.resize(n + 1);  // Redimensionăm lista pentru n noduri (indexate de la 1)

    int a, b;
    for (int i = 0; i < m; ++i) {
        f >> a >> b;
        lista[a].push_back(b);  // Adăugăm b la lista de adiacență a nodului a
        lista[b].push_back(a);  // Adăugăm a la lista de adiacență a nodului b (graful este neorientat)
    }

    f.close();
}

// Funcția pentru afișarea listei de adiacență
void afisareLista(const vector<vector<int>>& lista, int n) {
    for (int i = 1; i <= n; ++i) {
        cout << "Nodul " << i << " este adiacent cu: ";
        for (int j = 0; j < lista[i].size(); ++j) {
            cout << lista[i][j] << " ";  // Afișăm fiecare vecin al nodului i
        }
        cout << endl;
    }
}

// Funcție pentru parcurgerea în lățime (BFS)
void bfs(int s, const vector<vector<int>>& graf, vector<int>& parinte) {
    int n = graf.size();
    vector<bool> vizitat(n, false);  
    queue<int> q;

    q.push(s);
    vizitat[s] = true;
    parinte[s] = -1;

    while (!q.empty()) {
        int nod = q.front();
        q.pop();

        for (int i : graf[nod]) {  // Iterăm prin vecinii nodului curent
            if (!vizitat[i]) {
                q.push(i);
                vizitat[i] = true;
                parinte[i] = nod;
            }
        }
    }
}

// Funcție pentru a afișa drumul minim de la nodul de start s la nodul x
void afiseazaDrum(int x, const vector<int>& parinte) {
    vector<int> drum;

    for (int i = x; i != -1; i = parinte[i]) {
        drum.push_back(i);
    }

    reverse(drum.begin(), drum.end());

    cout << "Drumul minim de la s la x este: ";
    for (int nod : drum) {
        cout << nod + 1 << " ";  // Afișăm nodurile din drum (indexate de la 1)
    }
    cout << endl;
}

// Funcția pentru construirea matricei de adiacență
void construiesteMatriceAdiacenta(const string& numeFisier, vector<vector<int>>& matrice, bool orientat) {
    ifstream f(numeFisier);
    if (!f) {
        cout << "Eroare la deschiderea fișierului!" << endl;
        return;
    }

    int n, m;
    f >> n >> m;

    matrice.resize(n, vector<int>(n, 0));

    for (int i = 0; i < m; ++i) {
        int u, v;
        f >> u >> v;
        u--; v--;  // Ajustăm indexarea

        matrice[u][v] = 1;
        if (!orientat) {
            matrice[v][u] = 1;
        }
    }

    f.close();
}

// Funcția pentru afișarea matricei de adiacență
void afiseazaMatriceAdiacenta(const vector<vector<int>>& matrice) {
    cout << "Matricea de adiacență este:" << endl;
    for (const auto& rand : matrice) {
        for (int elem : rand) {
            cout << elem << " ";
        }
        cout << endl;
    }
}

int main() {
    vector<vector<int>> matriceAdiacenta;  // Declaram matricea de adiacență
    bool orientat;

    cout << "Introduceti 1 pentru graf orientat sau 0 pentru graf neorientat: ";
    cin >> orientat;

    // Construim matricea de adiacență din fișierul "input.in"
    construiesteMatriceAdiacenta("input.in", matriceAdiacenta, orientat);

    // Afișăm matricea de adiacență
    afiseazaMatriceAdiacenta(matriceAdiacenta);

    int s, x;
    cout << "Introduceti nodul de start s si nodul destinatie x (indexare de la 1): ";
    cin >> s >> x;
    s--; x--;

    int n = matriceAdiacenta.size();
    vector<int> parinte(n, -1);

    // Apelăm BFS pentru a găsi drumul de la s
    bfs(s, matriceAdiacenta, parinte);

    if (parinte[x] != -1) {
        afiseazaDrum(x, parinte);
    } else {
        cout << "Nu exista drum de la " << s + 1 << " la " << x + 1 << endl;
    }

    vector<vector<int>> lista;  // Lista de adiacență
    int nrNoduri;

    // Construim lista de adiacență din fișierul "lista.in"
    construiesteLista("lista.in", lista, nrNoduri);

    // Afișăm lista de adiacență
    afisareLista(lista, nrNoduri);

    return 0;
}