Cod sursa(job #1783521)

Utilizator MithrilBratu Andrei Mithril Data 19 octombrie 2016 08:29:03
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int n,x,y,z,k;

class DisjointSet{
private:
    struct Node{
        int data;
        Node* parent;
        int _rank;
    };
    unordered_map<int,Node*> setDictionary;
public:
    /*Creates a set with one element*/
    void makeSet(int data){
        Node* node = new Node();
        node->data=data;
        node->parent=node;
        node->_rank=0;
        setDictionary[data]=node;
    }
    /*
    Find the representative recursively
    Optimises the structure by path compression
    */
    Node* findParent(Node* node){
        Node* parent = node->parent;
        if(parent==node)
            return parent;
        node->parent = findParent(node->parent); // Path compression
        return node->parent;
    }
    /*
        Display the representative of a node
    */
    int findParent(int data){
        Node* node = findParent(setDictionary[data]);
        return node->data;
    }
    /*
        Combines two sets into one
        Union done by rank
    */
    void unionSets(int data1, int data2){
        Node* node1 = setDictionary[data1];
        Node* node2 = setDictionary[data2];

        Node* parent1 = findParent(node1);
        Node* parent2 = findParent(node2);

        if(parent1->data==parent2->data)
            return;
        /*Whoever's rank is higher becomes the new parent */
        if(parent1->_rank>=parent2->_rank){
            parent1->_rank = (parent1->_rank==parent2->_rank) ? parent1->_rank+1 : parent1->_rank;
            parent2->parent = parent1;
        }
        else
            parent1->parent=parent2;
    }
};

int main()
{
    fin>>n>>k;
    DisjointSet wow;
    for(int i=1;i<=n;i+=1)wow.makeSet(i);
    for(int i=0;i<k;i+=1){
        fin>>z;
        switch(z){
        case 1:
            fin>>x>>y;
            wow.unionSets(x,y);
            break;
        case 2:
            fin>>x>>y;
            if(wow.findParent(x)==wow.findParent(y))
                fout<<"DA"<<'\n';
            else
                fout<<"NU"<<'\n';
        }
    }
    return 0;
}