Cod sursa(job #2795804)

Utilizator linte_robertLinte Robert linte_robert Data 7 noiembrie 2021 00:13:01
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

int find(int x, vector < int > &t){
    int r, y;
    //merg in subgraf pana la radacina
    for( r = x; t[r] != r; r = t[r] );
    for(x = x; t[x] != x; x = t[x] ){
        y = t[x];
        t[x] = r;
        x = y;
    }
    return r;
}
void unite(int x, int y, vector < int > &rang, vector < int > &t){
    if( rang[x] > rang[y] ){
        t[y] = x;
    }
    else t[x] = y;
    if( rang[x] == rang[y] ) rang[y]++;
}

int main(){
    ifstream fin("disjoint.in");
    ofstream fout("disjoint.out")

    int x, y, operatie;
    int n, m;
    fin >> n >> m;
    vector < int > t;
    vector < int > rang;
    rang.push_back(-1);
    t.push_back(0);
    for( int i = 1; i <= n; i++ ){
        t.push_back(i);
        rang.push_back(1);
    }
    for( int i = 1; i <= m; i++ ){
        fin >> operatie >> x >> y;
        if( operatie == 2 ){
            if( find(x,t) == find(y,t) ) fout << "DA" << "\n";
            else fout << "NU" << "\n";
        }
        else{
            unite(find(x,t), find(y,t),rang,t);
        }
    }
}