Cod sursa(job #2367908)

Utilizator TeddyDinutaDinuta Eduard Stefan TeddyDinuta Data 5 martie 2019 12:50:55
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.85 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");
int n,m,p[100100],h[100100],op,x,y;
void init(int n)
{
    for(int i=1;i<=n;i++)
    {
        p[i]=i;
        h[i]=1;
    }
}
int Find(int x)
{
    int r=x;
    while(r!=p[r])
        r=p[r];
    while(p[x]!=r)
    {
        int t=p[x];
        p[x]=r;
        x=t;
    }
    return r;
}
void Union(int x,int y)
{
    int r1=Find(x);
    int r2=Find(y);
    if(h[r1]>h[r2])
        p[r2]=r1;
    else if(h[r1]<h[r2])
        p[r1]=r2;
    else
    {
        p[r1]=r2;
        h[r2]++;
    }
}
int main()
{
    in>>n>>m;
    init(n);
    for(int i=1;i<=m;i++)
    {
        in>>op>>x>>y;
        if(op==1) Union(x,y);
        else if(Find(x)==Find(y)) out<<"DA\n";
        else out<<"NU\n";
    }
    return 0;
}