Cod sursa(job #1806179)

Utilizator M.AndreiMuntea Andrei Marius M.Andrei Data 14 noiembrie 2016 21:53:46
Problema Paduri de multimi disjuncte Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <map>
using namespace std;

typedef struct _NODE
{
   int rank;
   int data;
   _NODE* parent;
}NODE, *PNODE;


map<int, PNODE> disjointSet;

ifstream f{ "disjoint.in" };
ofstream q{ "disjoint.out" };

PNODE getNode(int data)
{
   return disjointSet[data];
}

PNODE makeSet(int data)
{
   PNODE newNode = new NODE();
   newNode->rank = 0;
   newNode->data = data;
   newNode->parent = newNode;

   return newNode;
}

PNODE findParent(PNODE root)
{
   if (root->data == root->parent->data)
   {
      return root;
   }
   root->parent = findParent(root->parent);
   return root->parent;
}

void unionSets(int x, int y)
{
   PNODE xNode = getNode(x);
   PNODE yNode = getNode(y);

   PNODE parentX = findParent(xNode);
   PNODE parentY = findParent(yNode);

   if (parentX->data == parentY->data)
   {
      return;
   }


   if (parentX->rank >= parentY->rank)
   {
      if (parentX->rank == parentY->rank)
      {
         parentX->rank++;
      }
      parentY->parent = parentX;
   }
   else
   {
      parentX->parent = parentY;
   }
}


int main()
{
   int n, m, op, y, x;
   f >> n >> m;
  
   for (int i = 0; i <= n; ++i)
   {
      disjointSet[i] = makeSet(i);
   }

   for (int i = 0; i < m; ++i)
   {
      f >> op >> x >> y;
      if (op == 1) unionSets(x, y);
      else {
         PNODE parentX = findParent(getNode(x));
         PNODE parentY = findParent(getNode(y));
         (parentX->data == parentY->data) ? q << "DA\n" : q << "NU\n";
      }
   }

   f.close();
   q.close();
   return 0;
}