Cod sursa(job #3218541)

Utilizator eoanaflr05@gmail.comFlorea Ioana [email protected] Data 27 martie 2024 12:41:54
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
#define NMAX 100000
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int n,m;
int tata[NMAX];
int h[NMAX]; ///h[i]=inaltimea arborelui cu radacina i

void Union(int x,int y)
{
    if(h[x]<h[y])
        tata[x]=y;
    else if(h[y]<h[x]) tata[y]=x;
    else ///inaltimile sunt egale
    {   tata[y]=x; h[y]++; }
}

int Find(int x)
{int r,y;
    ///mai intai aflu radacina arborelui din care face parte x
    r=x;
    while(tata[r]!=r) r=tata[r];
    ///parcurg din tata drumul de la x la r si fac toate nodurile fii ai lui r
    do
    {
        y=tata[x];
        tata[x]=r;
        x=y;
    }
    while(tata[x]!=r);
    return tata[x];
}

int main()
{int i,x,y,z;
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        tata[i]=i;
        h[i]=1;
    }
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>z;
        if(x==1) Union(Find(y),Find(z));
        else {if(Find(y)==Find(z))  fout<<"DA"<<'\n'; else fout<<"NU"<<'\n';}
    }
    return 0;
}