Cod sursa(job #2955058)

Utilizator velciu_ilincavelciu ilinca velciu_ilinca Data 16 decembrie 2022 00:19:33
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>

using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");
int rang[100005],tata[100005];
void union1(int reprezentant1,int reprezentant2)
{
    if(rang[reprezentant1]==rang[reprezentant2])
    {
        tata[reprezentant1]=reprezentant2;
        rang[reprezentant2]++;
    }
    else if(rang[reprezentant1]>rang[reprezentant2])
    {
        tata[reprezentant2]=reprezentant1;
    }
    else if(rang[reprezentant1]<rang[reprezentant2])
    {
        tata[reprezentant1]=reprezentant2;
    }

}
int find1(int node)
{
    int reprezentant=node;
    while(tata[reprezentant]!=reprezentant)
    {
        reprezentant=tata[reprezentant];
    }
    while(tata[node]!=node)
    {
        int copie=tata[node];
        tata[node]=reprezentant;
        node=copie;
    }
    return reprezentant;
}
int main()
{
    int n,m;
    in>>n>>m;
    for(int i=1;i<=n;i++)
    {
        tata[i]=i;
        rang[i]=1;
    }
    for(int i=1;i<=m;i++)
    {
        int q,node1,node2;
        in>>q>>node1>>node2;
        if(q==1)///unim cei 2 reprezentanti
        {
            union1(find1(node1),find1(node2));
        }
        if(q==2)
        {
            if(find1(node1)==find1(node2))///daca au ac reprezentant
                out<<"DA"<<'\n';
            else
                out<<"NU"<<'\n';
        }
    }
    return 0;
}