Cod sursa(job #2692736)

Utilizator paulaiugaPaula Iuga paulaiuga Data 3 ianuarie 2021 16:39:48
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>
#include <iostream>

using namespace std;

ifstream in ("disjoint.in");
ofstream out ("disjoint.out");

vector<int> parinte, size;

void make_set(int v)
{
    parinte[v] = v; //se face o multime dintr-un nod => se face un arbore
    size[v] = 1;
}

int find_set(int v)
{
    if (v == parinte[v])//se cauta arborele parinte al nodului v
        return v;
    return parinte[v] = find_set(parinte[v]);
}

void union_sets(int a, int b)
{
    a = find_set(a);
    b = find_set(b);
    if (a != b)   //daca multimea din care face parte a e diferita de cea din care face parte b
    {
        //sunt multimi disjuncte si se unesc
        if (size[a] < size[b])//doar daca marimea arborelui lui a e mai mica decat cea a lui b
            swap(a, b);
        parinte[b] = a;//se unesc arborii adica parintele lui b devine a
        if(size[a] == size[b])
        {
            size[a] += 1;
        }
        //size[a] += size[b];//dimensiunea lui a creste
    }
}
int main()
{
    int N,M,x,y,z;
    in>>N>>M;
    parinte.assign(N,0);
    size.assign(N,0);

    for(int i = 1; i <= N; i++)
    {
        make_set(i);
    }

    for(int i = 1; i<=M; i++)
    {
        in>>x>>y>>z;

        switch(x)
        {

        case 1: //reuniune
        {
            union_sets(y,z);
            union_sets(find_set(y), find_set(z));
            break;
        }
        case 2: //cautare
        {
            if(find_set(y) == find_set(z))

                out <<"DA\n";

            else
                out<<"NU\n";
                break;


        }
        }

    }

    return 0;
}