Cod sursa(job #2674825)

Utilizator CiubarLoverBaiatu cu Ciubaru CiubarLover Data 20 noiembrie 2020 14:02:36
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int n,m;
int card[100005];///numarul de elemente ale arborelui cu radacina i
int parent[100005];///radacina arborelui din care face parte nodul i
int find_parent(int pos)
{
    ///Se cauta radacina arborelui din care face parte nodul pos
    if (parent[pos]!=pos)
    {
        parent[pos]=find_parent(parent[pos]);
        return parent[pos];
    }
    return pos;
}
void reuniune(int x,int y)
{
    ///Reunim cele 2 multimi din care fac parte x si y

    ///Gasim radacinile arborilor din care fac parte nodurile x si y
    x=find_parent(x);
    y=find_parent(y);
    ///Arborele cu mai putine elemente se leaga de cel cu mai multe elemente
    if (card[x]<card[y])
        swap(x,y);
    parent[y]=x;
    card[x]+=card[y];
}
bool check_same_set(int x,int y)
{
    ///Verificam daca elementele x si y fac parte din aceeasi multime

    ///Gasim radacinile arborilor din care fac parte elementele x si y
    x=find_parent(x);
    y=find_parent(y);

    return x==y;///Multimiile din care fac parte elementele trebuie sa aiba aceeasi radacina
}
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        ///Se initializeaza numarul de elemente si radacina arborelui i
        parent[i]=i;
        card[i]=1;
    }
    int type,x,y;
    for(int i=1;i<=m;i++)
    {
        fin>>type>>x>>y;
        if (type==1)
            reuniune(x,y);
        else
        {
            if (check_same_set(x,y))
                fout<<"DA";
            else
                fout<<"NU";
            fout<<"\n";
        }
    }
    return 0;
}