Cod sursa(job #2800894)

Utilizator andreea.ioanaSora Andreea-Ioana andreea.ioana Data 14 noiembrie 2021 12:55:20
Problema Paduri de multimi disjuncte Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

class Graf
{
   private:
       int nrN, nrM; ///Numar noduri, numar muchii
       vector <vector<int>> listaAd; ///lista de adiacenta graf
   public:
       Graf(int, int, vector <vector<int>> &);
       ~Graf();
       int Find(int, vector <int> &);
       void Union(int, int, vector <int> &, vector <int> &);
};

Graf :: Graf(int nrNoduri, int nrMuchii, vector <vector<int>> &lista)
{
     nrN = nrNoduri;
     nrM = nrMuchii;
     listaAd = lista;
}

Graf :: ~Graf()
{
    nrN = 0;
    nrM = 0;
    listaAd.clear();
}

int Graf :: Find(int nod, vector <int> &tata)
{
    if (tata[nod] == nod)
          return nod;
    int rez = Find(tata[nod], tata);
    tata[nod] = rez;
    return rez;
}

void Graf :: Union(int nod1, int nod2, vector <int> &tata, vector <int> &rang)
{
    int TataNod1 = Find(nod1, tata);
    int TataNod2 = Find(nod2, tata);
    if (TataNod1 == TataNod2)
        return;
    if (rang[TataNod1] < rang[TataNod2])
           tata[TataNod1] = TataNod2;
    else if (rang[TataNod1] > rang[TataNod2])
             tata[TataNod2] = TataNod1;
         else
         {
            tata[TataNod2] = TataNod1;
            rang[TataNod1]++;
         }
}

void ProblemaPaduriDeMultimiDisjuncte()
{
    ifstream fin("disjoint.in");
    ofstream fout("disjoint.out");
    int n, m, st, dr, operatie;
    fin >> n >> m;
    vector <vector<int>> vgol(n + 1,{0});
    vector <int> tata(n + 1);
    vector <int> rang(n + 1, 0);
    Graf g(n, m, vgol);
    for (int i = 1; i <= n; i++)
           tata[i] = i;
    for (int i = 1; i <= m; i++)
    {
        fin >> operatie >> st >> dr;
        if (operatie == 1)
        {
            g.Union(st, dr, tata, rang);
        }
        else if (g.Find(st, tata) == g.Find(dr, tata))
                 fout << "DA" << "\n";
             else fout << "NU" << "\n";
    }
    fin.close();
    fout.close();
}

int main()
{
    ProblemaPaduriDeMultimiDisjuncte();
    return 0;
}