Cod sursa(job #1758040)

Utilizator crushackPopescu Silviu crushack Data 16 septembrie 2016 13:00:37
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
#include <vector>

using namespace std;

const char NU[] = "NU";
const char DA[] = "DA";

int find(vector<pair<int, int>>& p, int x) {
  if (x == p[x].first) {
    return x;
  }
  return (p[x].first = find(p, p[x].first));
}

void unite(vector<pair<int, int>>& p, int x, int y) {
  if (p[x].second > p[y].second) {
    p[y].first = x;
    p[x].second += p[y].second;
  } else {
    p[x].first = y;
    p[y].second += p[x].second;
  }
}

int main() {
  vector<pair<int, int>> p;
  ifstream fin("disjoint.in");
  ofstream fout("disjoint.out");
  int n, m;

  fin >> n >> m;
  p.resize(n + 1);

  for (size_t iter = 0; iter < p.size(); ++iter) {
    p[iter].first = iter;
    p[iter].second = 1;
  }

  for (int iter = 0; iter < m; ++iter) {
    int choice, x, y;
    fin >> choice >> x >> y;
    switch(choice) {
      case 1:
        unite(p, x, y);
        break;
      case 2:
        fout << (find(p, x) == find(p, y) ? DA : NU) << "\n";
        break;
    }
  }

  return 0;
}