Cod sursa(job #2944411)

Utilizator Ruxi_GontescuGontescu Maria Ruxandra Ruxi_Gontescu Data 22 noiembrie 2022 15:25:49
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int Find (int x, vector<int> & tata ){
    // calculam "seful"
    int y = x, t;
    while (y != tata[y])
        y = tata[y];
    // retragem muchiile
    while (x != y){
        t = tata[x];
        tata[x] = y;
        x = t;
    }
    return x;
}

// setare parinti
void Unite (int x, int y, vector<int>& tata){
    x = Find(x, tata);
    y = Find(y, tata);
    tata[y] = x;
}
int main() {
    // citire date
    ifstream f ("disjoint.in");
    int n, m;
    int x, y, op;
    int i;
    f >> n >> m;
    vector<int> tata(n+1);
    // init tata
    for(i=1; i<=n; i++)
        tata[i] = i;
    ofstream g ("disjoint.out");
    for (i=1; i<=m; i++){
        f >> op >> x >> y;
        if (op == 1){
            if (Find(x, tata) != Find(y, tata))
                Unite(x, y, tata);
        }
        else {
                if (Find(x, tata) == Find(y, tata))
                    g << "DA\n";
                else
                    g << "NU\n";
            }
    }
    f.close();
    g.close();
    return 0;
}
// complexitate add/ search = log*n (opusul lui ackerman)
// spatiu O(n) -  vectorul de tati