Cod sursa(job #2792584)

Utilizator TDV24Tont Dragos-Valentin TDV24 Data 1 noiembrie 2021 22:51:40
Problema BFS - Parcurgere in latime Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.24 kb
#include <bits/stdc++.h>
using namespace std;

class Graf {
private:
    int nr_noduri;
    int nr_muchii;
    vector<vector<int>> lista_vecini;

public:
    Graf();

    Graf(int nr_noduri, int nr_muchii);

    ~Graf();

    void graf_neorientat(istream &fis_sursa);

    void graf_orientat(istream &fis_sursa);

    void DFS(int nod, vector<bool> &vizitat);

    int comp_conexe();

    vector<int> BFS(int nod);

    void distante(int nod, ostream &fis_destinatie);
};
    Graf::Graf()
    {
        nr_noduri = 0;
        nr_muchii = 0;
    }

    Graf::Graf(int nr_noduri_fis, int nr_muchii_fis)
    {
        vector<int> v(1,-1);
        nr_noduri = nr_noduri_fis;
        nr_muchii = nr_muchii_fis;
        for(int i = 1; i <= nr_noduri; i++)
            lista_vecini.push_back(v);
    }
    Graf::~Graf()
    {
        nr_noduri = 0;
        nr_muchii = 0;
        lista_vecini.clear();
    }

    void Graf::graf_neorientat(istream &fis_sursa)
    {
        int a, b;
        for(int i = 1; i <= nr_muchii; i++)
        {
            fis_sursa >> a >> b;
            lista_vecini[a].push_back(b);
            lista_vecini[b].push_back(a);
        }
    }

    void Graf::graf_orientat(istream &fis_sursa)
    {
        int a, b;
        for(int i = 1; i <= nr_muchii; i++)
        {
            fis_sursa >> a >> b;
            lista_vecini[a].push_back(b);
        }
    }

    void Graf::DFS(int nod, vector<bool> &viz)
    {
        viz[nod] = 1;
        for(int i = 1; i < lista_vecini[nod].size(); i++)
            if(viz[lista_vecini[nod][i]] == 0)
                DFS(lista_vecini[nod][i], viz);
    }

    int Graf::comp_conexe()
    {
        int nr = 0;
        vector<bool> viz(nr_noduri + 1, 0);
        for(int i = 1; i <= nr_noduri; i++)
            if(!viz[i])
            {
                nr++;
                DFS(i, viz);
            }
        return nr;
    }

    vector<int> Graf::BFS(int nod)
    {
        int a;
        queue<int> coada;
        vector<int> dist(nr_noduri + 1, -1);
        dist[nod] = 0;
        coada.push(nod);
        while(!coada.empty())
        {
            a = coada.front();
            coada.pop();

            for(int i = 1; i < lista_vecini[nod].size(); i++)
            {
                if(dist[lista_vecini[nod][a]] == -1)
                {
                    dist[lista_vecini[nod][a]] = dist[nod] + 1;
                    coada.push(lista_vecini[nod][a]);
                }
            }
        }
        return dist;
    }

    void Graf::distante(int nod, ostream &fis_destinatie)
    {
        vector<int> dist = BFS(nod);
        for(int i = 1; i <= nr_noduri; i++)
            fis_destinatie << dist[i] << " ";
    }

void pb1_BFS()
{
    ifstream f("bfs.in");
    ofstream g("bfs.out");
    int N, M, S;
    f >> N >> M >> S;
    Graf graf(N, M);
    graf.graf_orientat(f);
    graf.distante(S, g);
    f.close();
    g.close();
}

void pb2_DFS()
{
    ifstream f("dfs.in");
    ofstream g("dfs.out");
    int N, M;
    f >> N >> M;
    Graf graf(N, M);
    graf.graf_neorientat(f);
    g << graf.comp_conexe();
    f.close();
    g.close();
}

int main() {

    pb1_BFS();
    return 0;
}