Cod sursa(job #2949068)

Utilizator flavigFlavian flavig Data 29 noiembrie 2022 17:18:11
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <iostream>
#include <fstream>

using namespace std;

int tata[100001], h[100001];

int Find(int x)
{
    int r=x;
    //determinam radacina arborelui
    while(tata[r])
        r=tata[r];
    //comprimam drumul de la x la radacina
    int t,y=x;
    while(y!=r)
    {
        t=tata[y];
        tata[y]=r;
        y=t;
    }
    return r;
}

void Union(int x, int y)
{
    if(h[x]>h[y])
        tata[y]=x;
    else
    {
        tata[x]=y;
        if(h[x]==h[y])
            h[y]++;
    }
}

int main()
{
    ifstream f("disjoint.in");
    ofstream g("disjoint.out");

    int n,m,i,k,x,y;

    f>>n>>m;

    for(i=1;i<=n;i++)
    {
        tata[i]=0;
        h[i]=1;
    }

    while(f>>k>>x>>y)
    {
        if(k==1)
        {
            Union(x,y);
        }
        else if(k==2)
        {
            if(Find(x)==Find(y))
                g<<"DA"<<endl;
            else
                g<<"NU"<<endl;
        }
    }
    return 0;
}