Pagini recente » Cod sursa (job #1608148) | Cod sursa (job #2085308) | Cod sursa (job #2605331) | Cod sursa (job #1163140) | Cod sursa (job #2807430)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <tuple>
#include <list>
#include <algorithm>
#define Nmax 100001
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int N, M;
int parinte[Nmax], inaltime[Nmax];
class Graf{
private:
int Nr_Noduri, Nr_Muchii;
vector<int> GRAF[Nmax]; // lista de adiacenta
public:
Graf(int N, int M); // constructor
int Gasire_Radacina(int nod);
void Unire_Radacini(int nod1, int nod2);
void Disjoint();
};
// constructor
Graf :: Graf(int N, int M)
{
Nr_Noduri = N;
Nr_Muchii = M;
}
// gaseste radacina arborelui la care apartine nodul
int Graf :: Gasire_Radacina(int nod)
{
if ( nod != parinte[nod] )
{
parinte[nod] = Gasire_Radacina(parinte[nod]);
return parinte[nod];
}
return nod;
}
void Graf :: Unire_Radacini(int nod1, int nod2)
{
int rad_nod1 = Gasire_Radacina(nod1);
int rad_nod2 = Gasire_Radacina(nod2);
if ( rad_nod1 != rad_nod2 )
{
if ( inaltime[rad_nod1] > inaltime[rad_nod2] )
parinte[rad_nod2] = rad_nod1;
else
{
parinte[rad_nod1] = rad_nod2;
if ( inaltime[rad_nod1] == inaltime[rad_nod2] )
inaltime[rad_nod2] ++;
}
}
}
void Graf :: Disjoint()
{
for ( int i = 1; i <= Nr_Noduri; i++ ) // fiecare nod este propriul sau parinte
parinte[i] = i;
for ( int i = 1; i <= Nr_Muchii; i++ )
{
int op, x, y;
fin >> op >> x >> y;
if ( op == 1 ) // reunim multimile nodurilor x si y
Unire_Radacini(x,y);
else
{
int a = Gasire_Radacina(x); // daca nodurile x si y au aceeasi radacina atunci sunt din aceeasi multime
int b = Gasire_Radacina(y);
if ( a == b )
fout << "DA\n";
else
fout << "NU\n";
}
}
}
int main()
{
fin >> N >> M;
Graf G(N, M);
G.Disjoint();
return 0;
}