Cod sursa(job #2171192)

Utilizator benjamin2205Zeic Beniamin benjamin2205 Data 15 martie 2018 11:31:18
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.69 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("bfs.in");
ofstream g ("bfs.out");

int n, m, s;
vector <int> listaVecini[100005];
int matriceAdiac[100][100];

queue <int> nodCoada;
queue <int> costCoada;

int vizitati[100005];

void citire();
void bfs() {
    int nodNou;
    int costNou;

    /// Pun nodul de start in coada, la fel si costul lui
    nodCoada.push(s);
    costCoada.push(0);

    /// Il marchez ca vizitat
    vizitati[s] = -2;

    cout << "a";

    while (!nodCoada.empty()) {
        /// Scot primul nod din coada
        nodNou = nodCoada.front();
        nodCoada.pop();

        /// Scot primul cost din coada
        costNou = costCoada.front();
        costCoada.pop();

        /// Iterand prin toate nodurile
        for (int i = 1; i <= n; ++i) {
            /// Le caut pe cele spre care exista arc pornind de la nodul Curent
            if (matriceAdiac[nodNou][i] ==  1 && vizitati[i] == 0) {
                /// Daca exista, le pun in coada
                nodCoada.push(i);
                /// Pun si costul in coada
                costCoada.push(costNou + 1);
                /// Le marchez si ca vizitate, cu costul lor
                vizitati[i] = costNou + 1;
            }
        }

    }
}

void afisare() {
    for (int i = 1; i <= n; ++i) {
        if (vizitati[i] == 0) {
            g << -1 << ' ';
        }
        else if (vizitati[i] == -2) {
            g << 0 << ' ';
        }
        else {
            g << vizitati[i] << ' ';
        }
    }
}

void bfs2() {
    int nodCurent;
    int costCurent;

    nodCoada.push(s);
    costCoada.push(0);

    vizitati[s] = -2;

    while(!nodCoada.empty()) {
        nodCurent = nodCoada.front();
        costCurent = costCoada.front();

        nodCoada.pop();
        costCoada.pop();

        /// Pentru fiecare nod din lista de vecini
        for (int i = 0; i < listaVecini[nodCurent].size(); ++i) {
            /// Daca nu e vizitat deja nodul, il punem in coada
            if (vizitati[listaVecini[nodCurent][i]] == 0) {
                nodCoada.push(listaVecini[nodCurent][i]);
                costCoada.push(costCurent + 1);

                vizitati[listaVecini[nodCurent][i]] = costCurent + 1;
            }
        }
    }
}

int main()
{
    f >> n >> m >> s;

    citire();
    bfs2();

//    bfs();
    afisare();
    return 0;
}

void citire() {
    int prim;
    int secund;

    /// Citesc toate arcele
    for (int i = 1; i <= m; ++i) {
        f >> prim;
        f >> secund;

        /// Adaug fiecarui nod, nodul adiacent, in lista de vecini.
        listaVecini[prim].push_back(secund);
    }
}