Pagini recente » Cod sursa (job #869262) | Cod sursa (job #806057) | Cod sursa (job #373133) | Cod sursa (job #848180) | Cod sursa (job #2800894)
#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;
}