Cod sursa(job #2976233)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 8 februarie 2023 18:30:35
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <memory>
#include <vector>

using namespace std;

class DisjointSet{
private:
  int setSize;
  vector<int> parent, rank;
public:
  DisjointSet(int size){
    setSize = size + 1;
    parent.resize(setSize);
    rank.resize(setSize);
    for (int i = 1; i < setSize; ++i) {
      parent[i] = i;
      rank[i] = 1;
    }
  }
  int findParent(int k) {
    if (parent[k] != k)
      parent[k] = findParent(parent[k]);
    return parent[k];
  }
  void unite(int a, int b) {
    a = findParent(a);
    b = findParent(b);
    if (rank[a] == rank[b]) {
      parent[a] = b;
      ++rank[b];
      return;
    }
    if (rank[a] > rank[b])
      swap(a,b);
    parent[a] = b;
  }
};

class Solver{
private:
public:
  Solver() {
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
  }
  ~Solver() {
    fclose(stdin);
    fclose(stdout);
  }
  void execute() {
    int N, M;
    int op, x, y;
    scanf("%d%d", &N, &M);
    DisjointSet dSet(N);
    for (int i = 1; i <= M; ++i) {
      scanf("%d%d%d", &op, &x, &y);
      if (op == 1)
	dSet.unite(x, y);
      else
	printf(dSet.findParent(x) == dSet.findParent(y) ? "DA\n" : "NU\n");
    }
  }
};

int main() {
  unique_ptr<Solver> s = make_unique<Solver>();
  s->execute();
  return 0;
}