Cod sursa(job #2422924)

Utilizator SternulStern Cristian Sternul Data 20 mai 2019 13:20:16
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
//
// Created by Cristian Stern on 5/20/2019.
//

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

void unite(int x, int y, vector <int > &T, vector < int > &R){
    if(R[x] > R[y])
        T[y] = x;
    else T[x] = y;
    if(R[x] == R[y]){
        R[y]++;
    }
}

int find(int x, vector <int> &T){
    int y, R;
    for(R = x;R != T[R];R = T[R]);
    while(x != T[x]){
        y = T[x];
        T[x] = R;
        x = y;
    }
    return R;
}

int main(){
    int n, m, x, y, z;
    ifstream f("disjoint.in");
    ofstream g("disjoint.out");

    //ifstream f("E:\\FMI\\AG\\lab3\\date.in");
    //ofstream g("E:\\FMI\\AG\\lab3\\date.out");

    f>>n>>m;
    vector < int > TT(n);
    vector < int > RG(n);
    for(int i = 0;i < n;i++){
        TT[i] = i;
        RG[i] = 1;
    }

    for(int i = 0;i < m;i++){
        f>>z>>y>>x;
        y--;
        x--;
        if(z == 2){
            if(find(x, TT) == find(y, TT))
                g<<"DA\n";
            else g<<"NU\n";
        }
        else unite(find(x,TT), find(y,TT), TT, RG);
    }

}