Pagini recente » Cod sursa (job #3252100) | Cod sursa (job #3206921) | Cod sursa (job #2076973) | Cod sursa (job #1660343) | Cod sursa (job #1457628)
#include <fstream>
#include <vector>
#include <numeric>
#include <utility>
using namespace std;
class union_find{
vector<int> par, adanc;
public:
union_find(const int a):
par(a), adanc(a, 1){
iota(begin(par), end(par), 0); }
int find(int a){
static vector<int> v;
while(a != par[a]){
v.push_back(a);
a = par[a]; }
for(const auto x : v){
par[x] = a; }
v.clear();
return a; }
bool same(const int a, const int b){
return find(a) == find(b); }
void merge(int a, int b){
a = find(a), b = find(b);
if(adanc[a] == adanc[b]){
++adanc[b]; }
else if(adanc[a] > adanc[b]){
swap(a, b); }
par[a] = b; } };
int main(){
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int n, m;
f >> n >> m;
union_find uf(n);
for(int i = 0, a, b, c; i < m; ++i){
f >> a >> b >> c;
--b, --c;
switch(a){
case 1:
uf.merge(b, c);
break;
case 2:
g << (uf.same(b, c) ? "DA\n" : "NU\n");
break; } }
return 0; }