Cod sursa(job #1200431)

Utilizator xoSauceSergiu Ferentz xoSauce Data 22 iunie 2014 14:46:50
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <cstdio>
#define lim 100020
using namespace std;
class UF{
    int sz[lim];
    int id[lim];
    public:
        UF(int N){
            for(int i =0 ; i < N; i++){
                sz[i] = 0;
                id[i] = i;
            }
        }

        int root(int i){
            while(i != id[i]){
                id[i] = id[id[i]];
                i = id[i];
            }
            return i;
        }

        bool isConnected(int i,int j){
            return root(i) == root(j);
        }

        void unify(int i,int j){
            int p = root(i);
            int q = root(j);
            if(sz[p] < sz[q]){ id[p] = q; sz[q] += sz[p]; }
            else             { id[q] = p; sz[p] += sz[q]; }
        }

};


int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    int n,m;
    scanf("%d %d",&n,&m);
    UF x    (n);
    for(int i = 0 ;i < m ; i ++){
        int a,b,c;
        scanf("%d %d %d",&a,&b,&c);
        if(a == 1){ x.unify(b,c); }
        else      { (x.isConnected(b,c)) ? printf("DA\n"):printf("NU\n"); }
    }
    return 0;
}