Cod sursa(job #2228398)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 3 august 2018 15:53:36
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <iostream>
#include <fstream>
#define MAXN 100005

using namespace std;

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

int rang[MAXN],tata[MAXN],n,m;

int Find(int nod){
    int stapan = nod;

    while(tata[stapan] != stapan)
        stapan = tata[stapan];
    while(tata[nod] != stapan){
        int copie = nod;
        tata[copie] = stapan;
        nod = tata[nod];
    }

    return stapan;
}

void Union(int x,int y){
    if(rang[x] < rang[y])
        tata[x] = y;
    else if(rang[y] <= rang[x])
        tata[y] = x;
    if(rang[x] == rang[y])
        rang[x]++;
}

int main()
{
    in>>n>>m;

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

    for(int i = 1; i <= m; i++){
        int type,x,y;
        in>>type>>x>>y;
        if(type == 1)
            Union(Find(x),Find(y));
        else{
            if(Find(x) == Find(y))
                out<<"DA"<<"\n";
            else
                out<<"NU"<<"\n";
        }
    }
    return 0;
}