Cod sursa(job #2819762)

Utilizator pizzandreeaCiurescu Andreea pizzandreea Data 18 decembrie 2021 22:32:41
Problema Parcurgere DFS - componente conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.34 kb

#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

#define MAX 100001

using namespace std;
ifstream fin ("dfs.in");
ofstream fout("dfs.out");


vector <int> compBiconexe[MAX];

class Graf{
public:
    //date membre
    vector <int> A[MAX];    //liste de adiacenta
    int mM, mN;

    //constructor

    Graf(int N, int M){
        mN = N;
        mM = M;
    }


    void BFS();

    void DFS(int start, bool viz[MAX]);
    void ComponenteConexe();

//
//    void DFS_Biconex(int start, int father);
//    void AfisareBiconex();

};


void Graf :: BFS(){

    int x, y, start;
    fin >> start;
    for(int i = 1; i <= mM; i++){
        fin >> x >> y;
        A[x].push_back(y);
    }

    bool viz[MAX] = {false};
    queue <int> Q;

    int lg[MAX] = {0};  // lungimea drumului

    // vizitam nodul curent
    viz[start] = true;
    // il punem in coada
    Q.push(start);

    // fout<<1;
    while ( !Q.empty() ){
        x = Q.front();
        Q.pop();
        // preluam primul element din coada apoi il eliminam din coada

        for(int i = 0; i < A[x].size(); i++){
            // parcurgem toti vecinii lui x
            if(viz[A[x][i]] == 0){   // daca nu am mai vizitat vecinul asta{
                Q.push(A[x][i]);

                // il vizitam
                viz[A[x][i]] = 1;
                // creste lungimea drumului
                lg[A[x][i]] = lg[x] + 1;

            }
        }
    }

    for(int i = 1; i <= mN; i++)
        if(viz[i] != 0)
            fout << lg[i] << " ";
        else
            fout << -1 << " ";

}

void Graf::DFS(int start, bool viz[MAX]) {
    viz[start] = true;
    // vizitam nodul din care plecam

    for(int i = 0; i < A[start].size(); i++){
        // parcurgem toti vecinii nodului start
        if(!viz[A[start][i]] ){
            // daca nu am mai vizitat acest vecin
            DFS(A[start][i], viz);
        }
    }
}

void Graf::ComponenteConexe() {
    int x, y;

    for(int i = 1; i <= mM; i++){
        fin >> x >> y;
        A[x].push_back(y);
        A[y].push_back(x);
    }

    bool viz[MAX] = {false};
    int nrComp = 0;

    for(int i = 1; i <= mN; i++){
        if(!viz[i]){
            nrComp++;
            DFS(i,viz);
        }
    }

    fout << nrComp;

}


int main(){
    int N, M, S;
    fin >> N >> M;
    // fout << 1;
    Graf G(N,M);
    G.ComponenteConexe();


    return 0;
}