Cod sursa(job #2779430)

Utilizator smunteanuMunteanu Stefan Catalin smunteanu Data 3 octombrie 2021 18:33:22
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.78 kb
#include <fstream>
using namespace std;

struct Node {
  int rnk = 0;
  Node *prt = this;
};

static int N, M;
static Node *A[100001];
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

Node* findSet(Node *p) {
  while (p != p->prt)
    p = p->prt;
  return p;
}

void unite(Node *a, Node *b) {
  a = findSet(a);
  b = findSet(b);
  if (a != b) {
    if (a->rnk > b->rnk) {
      b->prt = a;
      a->rnk = b->rnk+1;
    } else {
      a->prt = b;
      b->rnk = a->rnk+1;
    }
  }
}

int main() {
  fin >> N >> M;
  for (int i=1; i<=N; i++)
    A[i] = new Node;
  for (int i=0; i<M; i++) {
    int c, x, y;
    fin >> c >> x >> y;
    if (c == 1) unite(A[x], A[y]);
    else fout << (findSet(A[x]) == findSet(A[y]) ? "DA\n" : "NU\n");
  }
}