Cod sursa(job #2861946)

Utilizator CiuiGinjoveanu Dragos Ciui Data 4 martie 2022 18:39:05
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
 
const int NMAX =  100020;
 
int pointsTo[NMAX], rang[NMAX];
int n, m;
 
int findRoot(int x) {
    int root = x;
    while (pointsTo[root] != root) { // ajungem la radacina, care pointeaza catre ea insasi
        root = pointsTo[root];
    }
    while (pointsTo[x] != x) {  // (schimbam valoarea cu a radacinii ca sa fie totul la zi si sa nu avem raspunsuri eronate)
        int aux = pointsTo[x];
        pointsTo[x] = root;
        x = aux;
    }
    /*
    for (int i = 1; i <= n; ++i) {
        cout << pointsTo[i] << " ";
    }
    cout << "\n";
     */
    return root;
}
 
void unite(int x, int y) {
    //unesc multimea cu rang mai mic de cea cu rang mai mare
    if (rang[x] > rang[y]) {
        pointsTo[y] = x;
    } else {
        pointsTo[x] = y;
    }
    //in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
    /*if (rang[x] == rang[y]) { //AICI MAI TRB SA INTELEG
        ++rang[y];
    }
     */
}
 
int main() {
    fin >> n >> m;
    //initial fiecare nod pointeaza catre el insusi iar rangul fiecarui arbore este 1
    for (int peak = 1; peak <= n; ++peak) {
        pointsTo[peak] = peak;
        rang[peak] = 1;
    }
    for (int i = 1; i <= m; ++i) {
        int operation, x, y;
        fin >> operation >> x >> y;
        if (operation == 2) {
            //verific daca radacina arborilor in care se afla x respectiv y este egala
            if (findRoot(x) == findRoot(y)) {
                fout << "DA";
            } else {
                fout << "NU";
            }
            fout << "\n";
        } else { //unesc radacinile arborilor corespunzatori multimilor nodurilor x respectiv y
            unite(findRoot(x), findRoot(y));
        }
    }
    return 0;
}
/*
4 5
 1 1 2
 1 3 4
 1 1 3
 2 2 4
 2 1 4
 
 */