Cod sursa(job #2795940)

Utilizator lalalaura_022Udroiu Laura-Ioana lalalaura_022 Data 7 noiembrie 2021 11:48:13
Problema Parcurgere DFS - componente conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.03 kb
#include <bits/stdc++.h>

using namespace std;

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

class graf
{
    int nr_noduri, nr_muchii;

    vector<vector<int> > lista_muchii;

    bool orientat;

public:
    graf();

    graf(int nr_noduri, int nr_muchii, bool orientat);

    ~graf() {}

    void BFS(int start);

    void DFS();

};

graf::graf()
{
    nr_noduri = 0;
    nr_muchii = 0;
    orientat = 0;
}

graf::graf(int nr_noduri, int nr_muchii, bool orientat)
{
    int i = 0, nod1, nod2;

    lista_muchii.resize(nr_noduri+1);

    this->nr_noduri = nr_noduri;
    this->nr_muchii = nr_muchii;
    this->orientat = orientat;

    while(i < nr_muchii)
    {
        f>>nod1>>nod2;
        if(orientat)
            lista_muchii[nod1].push_back(nod2);
        else
        {
            lista_muchii[nod1].push_back(nod2);
            lista_muchii[nod2].push_back(nod1);
        }
        i++;
    }
}

///----------------------------------------------------------------------------------bfs
void graf::BFS(int inceput)
{
    int i = 0, nod_curent;

    queue<int> q;

    vector<int>vizitat;
    vector<int>distanta;

    q.push(inceput);

    do
    {
        vizitat.push_back(0);
        distanta.push_back(-1);
        i++;

    }
    while(i <= nr_noduri);

    vizitat[inceput] = 1;
    distanta[inceput] = 0;

    while(!q.empty())
    {
        nod_curent = q.front();
        q.pop();
        for (auto j = lista_muchii[nod_curent].begin(); j != lista_muchii[nod_curent].end(); j++)
            if(!vizitat[*j])
            {
                vizitat[*j] = 1;
                q.push(*j);
                distanta[*j] = distanta[nod_curent] + 1;
            }
    }
    int marime = distanta.size();
    for(i = 1; i < marime; i++)
        g<<distanta[i]<<" ";
}
///----------------------------------------------------------------------------------DFS

void graf::DFS()
{
    int i, j, nr = 0, v, varf, marime;

    vector<int> vizitat;

    stack<int> comp;
    for(i = 0; i < nr_noduri + 1; i++)
        vizitat.push_back(0);

    for(i = 1; i < nr_noduri + 1; i++)
        if(vizitat[i] == 0)
        {
            comp.push(i);
            vizitat[i] = 1;

            while(!comp.empty())
            {
                varf = comp.top();
                v = 0;
                marime = lista_muchii[varf].size();
                int ok = 0;
                for(j = 0; j < marime && ok == 0; j++)
                    if(vizitat[lista_muchii[varf][j]] == 0)
                    {
                        v = lista_muchii[varf][j];
                        ok = 1;
                    }
                if(v)
                    {
                       comp.push(v);
                        vizitat[v] = 1;
                    }
                else
                    comp.pop();
            }
            nr++;
        }
    g<<nr;
}


int main()
{
    int n, m, s;
    f>>n>>m;
    graf test(n,m,0);

    test.DFS();
    return 0;
}