Pagini recente » Istoria paginii runda/irim_eralumis/clasament | Cod sursa (job #2423400) | Cod sursa (job #2424011) | Istoria paginii runda/dimineata_dulceata | Cod sursa (job #2696778)
#include<bits/stdc++.h>
using namespace std;
const int NMAX = 100100;
int sef[NMAX];
int g[NMAX];
// initializeaza vecotorul de sefi
void Init(int n)
{
for (int i = 0; i< n; i++) {
sef[i] = i;
g[i] = 1;
}
}
// Gaseste seful suprem al nodului
int Find(int nod)
{
if (sef[nod] != nod)
sef[nod] = Find(sef[nod]);
return sef[nod];
}
// Returneaza false daca cele doua noduri sunt deja unite
// Returneaza true si le uneste daca nu
bool Unite(int a, int b)
{
a = Find(a);
b = Find(b);
if (a == b)
return false;
if (g[a] > g[b])
swap(a, b);
sef[a] = b;
g[b] += g[a];
return true;
}
int main()
{
ifstream cin("disjoint.in");
ofstream cout("disjoint.out");
int n, m;
cin >> n >> m;
Init(n + 1);
for(int i = 0; i < m; i++) {
int op, a, b;
cin >> op >> a >> b;
if (op == 1) {
Unite(a, b);
}
else {
a = Find(a);
b = Find(b);
if (a == b)
cout << "DA\n";
else
cout << "NU\n";
}
}
return 0;
}