Cod sursa(job #2798540)

Utilizator ArthurelulRazvan Vilceanu Arthurelul Data 11 noiembrie 2021 15:25:37
Problema Parcurgere DFS - componente conexe Scor 15
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.43 kb
#include <iostream>
#include <list>
#include <fstream>

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


class Graph
{
private:
    // Numar varfuri
    int v;
    // Lista de adiacenta
    list<int> *adj;
public:

    Graph(int V);

    void addEdge(int a, int b);

    void BFS(int s);

    void DFS_rec(int s, bool *visited);

    void DFS_conex(int s);
};

Graph::Graph(int V)
{
    v=V;
    adj = new list<int>[V+1];

}

void Graph::addEdge(int a, int b)
{
    adj[a].push_back(b);
}

void Graph::BFS(int s)
{
    //Vector vizitati initiat cu toate valorile fals
    int *visited=new int[v+1];
    for (int i=1; i<=v; i++)

        visited[i]=-1;

    //Creare coada pentru BFS
    list <int> q;
    visited[s]=0;
    q.push_back(s);
    while(!q.empty())
        {
            //Accesare prim element si eliminarea lui din coada
            s=q.front();
            q.pop_front();


            //Adaugarea nodurilor nevizitate vecine in coada
            for(auto i = adj[s].begin(); i!=adj[s].end(); i++)
                {


                    if(visited[*i]==-1)
                        {



                            visited[*i]=visited[s]+1;
                            q.push_back(*i);
                        }
                }
        }

    for(int i=1; i<=v; i++)
        {
            g<<visited[i]<<" ";
        }

}

void Graph::DFS_rec(int s, bool *visited)
{

    visited[s]=true;

    for (auto i = adj[s].begin(); i!=adj[s].end(); i++)
        {
            if (!visited[*i])
                {

                    DFS_rec(*i,visited);
                }
        }

}

void Graph::DFS_conex(int s)
{
    int conex=0;
    bool ok=true;
    bool *visited=new bool[v+1];
    for (int i=1; i<=v; i++)

        visited[i]=false;
    while(ok)
        {
            for(int i=1; i<=v; i++)
                {
                    ok=false;
                    if (visited[i] == false)
                        {
                            conex++;
                            DFS_rec(i,visited);
                            ok=true;

                        }
                }
        }
    g<<conex;
}

int main()
{

    int n,m,x,y;
    f>>n>>m;
    Graph g(n);

    for(int i=0; i<m; i++)
        {
            f>>x>>y;
            g.addEdge(x,y);


        }



   g.DFS_conex(1);


    return 0;
}