Cod sursa(job #2832011)

Utilizator Teodor_AxinteAxinte Teodor-Ionut Teodor_Axinte Data 12 ianuarie 2022 17:41:30
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.3 kb
#include <bits/stdc++.h>

using namespace std;

const int N= 100010;

class Graf
{
private:
    int noduri , muchii;

    void dfs(int start,vector<int> v[N], vector<int> &viz);


    public:
    Graf(int,int);
    void add_edge(int x, int y);
    int nr_connected_components(vector<int> v[N], vector<int> &viz);
    void bfs(ifstream &, ofstream &,queue<pair<int,int>>, vector<int>*,vector<int>&,vector<int>&,int);
};

void Graf::bfs(ifstream &fin, ofstream &fout,queue<pair<int,int>> q,vector<int> adj[N], vector<int> &viz,vector<int> &ans,int nod_cerut)
{
    while(!q.empty())
    {
        pair<int,int> dp = q.front();
        int x = dp.first;
        int y = dp.second;
        ans[x] = y;
        for(auto it: adj[x])
            if(!viz[it])
            {
                viz[it] = 1;
                q.push(make_pair(it,y+1));
            }
        q.pop();
    }

    for(int i=1;i<=this->noduri;i++)
    {
        if(ans[i] == 0 && i != nod_cerut)
            ans[i] = -1;
        fout<<ans[i]<<" ";
    }
}

Graf::Graf(int n, int m)
{
    (*this).noduri = n;
    (*this).muchii = m;

    cout<<"Constructor " << n<<" "<<m<<'\n';
}

void Graf::dfs(int start, vector<int> v[N], vector<int> &viz)
{
    viz[start] = 1;
    for(auto it : v[start])
        if(!viz[it])
            dfs(it,v,viz);
    
}

int Graf::nr_connected_components(vector<int> v[N], vector<int> &viz)  {
    int ct=0;
    for(int i=1;i<=(this->noduri);i++)
        if(!viz[i]){
            dfs(i,v,viz);
            ct++;
        }
    return ct;
}



int main()
{
    int problema = 2;
    if(problema == 2)
    {
        ifstream fin("bfs.in");
        ofstream fout("bfs.out");
        int n,m,nc;
        fin>>n>>m>>nc;

        vector<int> adj[n+5] = {};
        vector<int> viz(n+5, 0);
        vector<int> ans(n+5, 0);
        queue<pair<int,int>> q ={};
       // for(auto it:viz)
       //     cout<<it<<" ";
       // cout<<'\n';

        for(int i=1;i<=m;i++)
        {
            int x,y;
            fin>>x>>y;
            if(x!=y)
                adj[x].push_back(y);
        }
        /*
        for(int i=1;i<=n;i++)
        {
            cout<<i<<" : ";
            for(auto it:adj[i])
                cout<<it<<" ";
            cout<<'\n';
        }
        cout<<"---------------\n";
        */
        q.push(make_pair(nc,0));
        viz[nc] = 1;

        Graf G (n,m);
        G.bfs(fin,fout,q,adj,viz,ans,nc);
    }
    if(problema == 1)
    {
        ifstream fin("dfs.in");
        ofstream fout("dfs.out");
        int n,m;
        fin>>n>>m;
        vector<int> adj[n+5] = {};
        vector<int> viz(n+5,0);
        for(auto it:viz)
            cout<<it<<" ";
        cout<<'\n';
        for(int i=1;i<=m;i++)
        {
            int x,y;
            fin>>x>>y;
            adj[x].push_back(y);
            adj[y].push_back(x);
        }
        for(int i=1;i<=n;i++)
            if(adj[i].size())
                {
                    cout<<i<<" : ";
                    for(auto it : adj[i])
                        cout<<it<<" ";
                    cout<<'\n';
                }
        cout<<"-----------------\n\n";

        Graf G (n,m);
        fout<<G.nr_connected_components(adj,viz);
    }

    return 0;
}