Cod sursa(job #2780181)

Utilizator PaduraruCristianPaduraru Cristian Daniel PaduraruCristian Data 6 octombrie 2021 11:25:49
Problema Parcurgere DFS - componente conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;


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


class Graph{
private:
    int n;
    vector < vector<int> > la;

    void dfs(int nod_crt, vector<bool> &viz);

public:
    Graph(int nr_noduri):n(nr_noduri), la(nr_noduri+1){}
    ~Graph() = default;

    void add_edge(int from, int to){
        la[from].push_back(to);
    }

    void bfs_print_dist(int start);

    int nr_conexe_dfs();
};


void Graph::bfs_print_dist(int start){

    vector<int> dist(n+1,0);
    queue<int> q;
    int nod_crt;

    q.push(start);
    dist[start]=1;

    while(!q.empty())
    {
        nod_crt = q.front();
        q.pop();
        for(auto nod_vecin: la[nod_crt])
        {
            if(dist[nod_vecin] == 0)
            {
                dist[nod_vecin] = dist[nod_crt] + 1;
                q.push(nod_vecin);
            }
        }
    }

    for(int i=1;i<=n;++i)
        g<<dist[i]-1<<' ';
}

int Graph::nr_conexe_dfs(){

    vector<bool> viz(n+1, false);
    int nr_c=0;
    for(int i=1;i<=n;++i)
    {
        if(!viz[i])
        {
            ++nr_c;
            dfs(i, viz);
        }
    }

    return nr_c;
}


void Graph::dfs(int nod_crt, vector<bool> &viz){

    for(auto nod_vecin: la[nod_crt])
    {
        if(!viz[nod_vecin])
        {
            viz[nod_vecin] = true;
            dfs(nod_vecin, viz);
        }
    }

}

int main()
{
    int n,m;
    int a,b;
    f>>n>>m;

    Graph gr(n);

    for(int i=0;i<m;++i)
    {
        f>>a>>b;
        gr.add_edge(a,b);
        gr.add_edge(b,a);
    }

    g<<gr.nr_conexe_dfs();
    return 0;
}