Cod sursa(job #2425811)

Utilizator PasarelAlex Oltean Pasarel Data 25 mai 2019 05:55:41
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

class disjointSet {
  vector<int> parent;
  vector<int> rank;

public:
  disjointSet(int n) : parent(n), rank(n, 0) {
    for (int i = 0; i < n; i++)
      parent[i] = i;
  }
  int find(int x) {
    if (parent[x] != x) {
      parent[x] = find(parent[x]);
    }
    return parent[x];
  }
  void unite(int x, int y) {
    int xParent = find(x);
    int yParent = find(y);

    if (rank[xParent] < rank[yParent]) {
      int aux = xParent;
      xParent = yParent;
      yParent = x;
    }

    parent[yParent] = xParent;
    if (rank[xParent] == rank[yParent])
      rank[xParent]++;
  }
};

int main() {
  int n, m;
  int r1, r2, r3;
  ifstream in("disjoint.in");
  ofstream out("disjoint.out");
  in >> n >> m;
  disjointSet S(n);
  for (int i = 0; i < m; i++) {
    in >> r1 >> r2 >> r3;
    if (r1 == 1) {
      S.unite(r2, r3);
    }
    if (r1 == 2) {
      if (S.find(r2) == S.find(r3)) {
        out << "DA" << endl;
      }
      else {
        out << "NU" << endl;
      }
    }
  }
  return 0;
}