Cod sursa(job #2789927)

Utilizator Tache_RoxanaTache Roxana Tache_Roxana Data 28 octombrie 2021 10:24:13
Problema BFS - Parcurgere in latime Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.32 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <list>
using namespace std;

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


class Graf {
    vector<list<int>> noduri;
    void dfs(int nod, vector<bool> &vizitate) {
        vizitate[nod] = true;
        for(auto i: noduri[nod])
            if(!vizitate[i])
                dfs(i, vizitate);
    }
    void bfs(int start, vector<int> &costuri, vector<bool> &vizitate,vector<int> &coada) {
        int st = 1, dr = 1;
        coada[st] = start;
        vizitate[start] = true;
        costuri[start] = 0;
        dr++;
        while(st != dr) {
            int k = coada[st];
            for(auto i: noduri[k])
                if(!vizitate[i]) {
                    costuri[i] += (costuri[k] + 1);
                    vizitate[i] = true;
                    coada[dr] = i;
                    dr++;
                }
            st++;
        }
    }
public:
    Graf(vector<list<int>> _noduri) : noduri(_noduri) {}
    friend ostream& operator<< (ostream& os, Graf graf) {
        os << graf.noduri.size() << " nodes\n";
        for(int i = 0; i < graf.noduri.size(); i++) {
            os << "node " << i << ": ";
            for(int j: graf.noduri[i])
                os << j << " ";
            os << "\n";
        }
        return os;
    }
    int nrConexe() {
        vector<bool> vizitate(noduri.size());
        int nr = 0;
        for(int i = 0; i < noduri.size(); i++)
            if(!vizitate[i]) {
                nr++;
                dfs(i, vizitate);
            }
        return nr;
    }
    void costuriBFS(int nod) {
        vector<int> costuri(noduri.size()), coada(noduri.size());
        vector<bool> vizitate(noduri.size());
        bfs(nod, costuri, vizitate, coada);
        for (int i = 0; i < noduri.size(); i++) {
            if(vizitate[i])
                out << costuri[i] << " ";
            else out << -1 << " ";
        }
    }
};

int main() {
    int noduri, muchii, start;
    in >> noduri >> muchii;
    in >> start; //doar ptr bfs
    vector<list<int>> aux(noduri);
    for(int i = 0; i < muchii; i++) {
        int x1, x2;
        in >> x1 >> x2;
        aux[x1 - 1].push_back(x2 - 1);
//        aux[x2 - 1].push_back(x1 - 1);  // daca e neorientat
    }
    Graf graf(aux);
    //out << graf.nrConexe(); //ptr DFS
    graf.costuriBFS(start - 1);
    return 0;
}