Cod sursa(job #1706999)

Utilizator Mihai96Saru Mihai Mihai96 Data 23 mai 2016 23:01:50
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>
#include <vector>
#include <list>
#include <queue>
#include <iterator>

using namespace std;

struct Nod {
    int distanta;
    bool vizitat;
    list<int> idNoduriAdiacente;

    Nod () {
        distanta = -1;
        vizitat = false;
    }
};

void viziteazaNod(int idNod, int idNodSursa, vector<Nod> &noduri) {
    noduri[idNod].vizitat = true;
    noduri[idNod].distanta = noduri[idNodSursa].distanta + 1;
}

void viziteazaNodurileAdiacenteNodului(int idNod, vector<Nod> &noduri, queue<int> &deVizitat) {
    list<int>::iterator idNodIteratie;
    idNodIteratie = noduri[idNod].idNoduriAdiacente.begin();
    while (idNodIteratie != noduri[idNod].idNoduriAdiacente.end()) {
        if (!noduri[(*idNodIteratie)].vizitat) {
            viziteazaNod((*idNodIteratie), idNod, noduri);
            deVizitat.push(*idNodIteratie);
        }
        ++idNodIteratie;
    }
}

void calculeazaDistanteLaToateNodurileDeLaNodul(int idNodSursa,
        vector<Nod> &noduri) {

    queue<int> deVizitat;
    noduri[idNodSursa].vizitat = true;
    noduri[idNodSursa].distanta = 0;
    deVizitat.push(idNodSursa);
    while (!deVizitat.empty()) {
        int idNodCurent = deVizitat.front();
        deVizitat.pop();
        viziteazaNodurileAdiacenteNodului(idNodCurent, noduri, deVizitat);
    }
}

int main() {
    ifstream fin("bfs.in");
    int n, m, s;
    fin >> n >> m >> s;
    vector<Nod> noduri(n+1);
    int i = 0;
    while (i < m) {
        int x, y;
        fin >> x;
        fin >> y;
        noduri[x].idNoduriAdiacente.push_back(y);
        i += 1;
    }
    fin.close();

    ofstream fout("bfs.out");
    calculeazaDistanteLaToateNodurileDeLaNodul(s, noduri);
    for (unsigned i = 1; i < noduri.size() - 1; ++i) {
        fout << noduri[i].distanta << " ";
    }
    fout << noduri[noduri.size() - 1].distanta << "\n";
    fout.close();
    return 0;
}