Cod sursa(job #2808654)

Utilizator ptr22222Petru Popescu ptr22222 Data 25 noiembrie 2021 13:16:54
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.7 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>

using namespace std;

ifstream in("disjoint.in");
ofstream out("disjoint.out");

const int nmax = 100001;
const int inf = (1<<30);

class Graf
{
private:
    bool orientat;
    int nrNoduri;
    vector <int> listaAdiacenta[nmax];
    vector <pair <int, int>> listaAdiacentaCost[nmax];
public:
    Graf(int nrNoduri = 0, bool orientat = false);
    void adaugaMuchieCost(int, int, int);
    void citireMuchii(int);
    void citireMuchiiCost(int);
    vector<int> BFS(int);
    void DFS(int, bool*);
    int nrComponenteConexe();
    void DFSStiva(int nodcurent, bool *, stack<int> &);
    void sortareTopologica();
    void TarjanCTC(int&, int, int*, int*, bool*, stack <int> &, vector<vector<int>> &);
    void CTC();
    void TarjanBC(int&, int, int, int*, int*, stack <int>&, vector<vector<int>>&);
    void BC();
    void TarjanMC(int&, int, int, int*, int*, vector<pair<int,int>>&);
    void MC();
    vector <int> citireHakimi();
    bool Hakimi(vector <int>);
    vector <int> Dijkstra(int);
    pair<int, vector <pair <int, int>>> Prim(int);
    vector <int> BellmanFord(int);
    void reuniune(int, int, vector<int>&, vector<int>&);
    int gasire(int, vector<int>&);
    void verifica(int, int, vector<int>&);
    void paduri();
};

Graf :: Graf(int nrNoduri, bool orientat) : nrNoduri(nrNoduri), orientat(orientat)
{
    this->nrNoduri = nrNoduri;
    this->orientat = orientat;
}

void Graf::reuniune(int nod1i, int nod2i, vector <int> &parinte, vector <int> &rang)
{
    int nod1 = gasire(nod1i,parinte);
    int nod2 = gasire(nod2i, parinte);
    if(rang[nod1] > rang[nod2])
    {
        parinte[nod1] = nod2;
    }
    else if(rang[nod2] <rang[nod1])
    {
        parinte[nod2] = nod1;
    }
    else
    {
        parinte[nod2] = nod1;
        rang[nod1]++;
    }
}

int Graf::gasire(int nod, vector <int> &parinte)
{
    if(parinte[nod] == -1)
    {
        return nod;
    }
    parinte[nod] = gasire(parinte[nod], parinte);
    return parinte[nod];
}

void Graf::verifica(int nod1, int nod2, vector<int>&parinte)
{
    if(gasire(nod1,parinte) == gasire(nod2, parinte))
    {
        out << "DA\n";
        return;
    }
    out << "NU\n";
}

void Graf::paduri()
{
    int n, m;
    in >> n >> m;
    int nod1, nod2, operatie;
    vector <int> parinte(nmax, -1);
    vector <int> rang(nmax, 0);
    for(int i = 0 ; i < m ; i++)
    {
        in >> operatie >> nod1 >> nod2;
        if(operatie == 1)
        {
            reuniune(nod1, nod2, parinte, rang);
        }
        else if(operatie == 2)
        {
            verifica(nod1, nod2, parinte);
        }
    }
}

int main()
{
    Graf g(1,true);
    g.paduri();
    return 0;
}