Cod sursa(job #2134192)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 17 februarie 2018 18:32:18
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin ("disjoint.in");
ofstream cout ("disjoint.out");

int Get_Root (int x, vector < int > &root) {

  int r = x;
  while (r != root[r]) {
    r = root[r];
  }

  while (x != root[x]) {
    int aux = root[x];
    root[x] = r;
    x = aux;
  }

  return r;
}

void Link (int x, int y, vector < int > &root, vector < int > &rang) {
  
  x = Get_Root (x, root);
  y = Get_Root (y, root);

  if (rang[x] == rang[y]) {
    ++ rang[x];
  }
  else if (rang[x] < rang[y]) {
    swap (x, y);
  } 

  root[y] = x;
}

int main () {

  int n, m;
  cin >> n >> m;

  vector < int > root (n + 1);
  vector < int > rang (n + 1);
  for (int i = 1; i <= n; ++ i) {
    root[i] = i;
    rang[i] = 1;
  }

  while (m --) {

    int type;
    cin >> type;

    if (type == 1) {
      int x, y;
      cin >> x >> y;
      Link (x, y, root, rang);
    }
    else {
      int x, y;
      cin >> x >> y;

      if (Get_Root (x, root) == Get_Root (y, root)) {
        cout << "DA\n";
      }
      else {
        cout << "NU\n";
      }
    }
  }
}