Cod sursa(job #1752951)

Utilizator sorynsooSorin Soo sorynsoo Data 5 septembrie 2016 16:23:46
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
//
//  main.cpp
//  09 Paduri de multimi disjuncte
//
//  Created by Sorin Sebastian Mircea on 05/09/16.
//  Copyright © 2016 Sorin Sebastian Mircea. All rights reserved.
//

#include <fstream>
using namespace std;
ifstream cin("disjoint.in");
ofstream cout("disjoint.out");

#define MAXN 100000

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


int cauta(int x) {
    int ant, org, aux;
    org = parinte[x];
    
    //Gasesc radacina arborelui
    while(parinte[org] != org )
        org = parinte[org];
    
    //Schimb fiecare parinte al arborelui direct cu radacina
    ant = x;
    while(parinte[ant] != ant) {
        aux = parinte[ant];
        parinte[ant] = org;
        ant = aux;
    }
    
    return org;
}

void uneste(int x, int y) {
    if(rang[x] > rang[y])
        parinte[y] = x;
    else
        parinte[x] = y;
    
    rang[y]++;
}

int main() {
    int i, tip, x, y;
    
    cin >> n >> m;
    
    for(i=1; i<=n; i++) {
        parinte[i] = i;
        rang[i] = i;
    }
    
    for(i=1; i<=m; i++) {
        cin >> tip >> x >> y;
        if(tip == 1) {
            uneste(cauta(x), cauta(y));
        }
        
        if(tip == 2) {
            if(cauta(x) == cauta(y))
                cout<<"DA\n";
            else
                cout<<"NU\n";
        }
        
    }
    
    return 0;
}