Cod sursa(job #1993458)

Utilizator Alex18maiAlex Enache Alex18mai Data 23 iunie 2017 02:10:21
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>

using namespace std;

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

int boss[100005];
int card[100005];

int stramos (int nod){
    int superboss = nod ;
    while (superboss != boss [superboss]) {
        superboss = boss [superboss] ;
    }
    while (nod != boss [nod]) {
        int aux = boss [nod] ;
        boss [nod] = superboss ;
        nod = aux ;
    }
    return superboss;
}

void unite (int a, int b){
    if (card[boss[a]] > card[boss[b]]){
        int old1=card[boss[b]];
        boss[b]=boss[a];
        card[boss[a]]+=old1;
    }
    else{
        int old2=card[boss[a]];
        boss[a]=boss[b];
        card[boss[b]]+=old2;
    }
}



int main()
{
    int n,m;
    cin>>n>>m;
    for (int i=1; i<=n; i++){
        boss[i]=i;
        card[i]=1;
    }
    for (int i=1; i<=m; i++){
        int x,a,b;
        cin>>x>>a>>b;
        if (x==1){
            unite (stramos(a), stramos(b));
        }
        if (x==2){
            if (stramos(a) == stramos(b)){
                cout<<"DA"<<'\n';
            }
            else{
                cout<<"NU"<<'\n';
            }
        }
    }
    return 0;
}