Cod sursa(job #2697347)

Utilizator veresflorianveres ioan florian veresflorian Data 18 ianuarie 2021 11:46:11
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream in("disjoint.in");
ofstream out("disjoint.out");

vector<int> par;
vector<int> rang;

int n,m;

int rad(int k)
{
    if(par[k]==0)
        return k;
    //cout<<k;
    return rad(par[k]);
}

void parintare(int x,int i)
{
    if(par[i]!=0)
        parintare(x,par[i]);
    par[i]=x,rang[i]=1;
}

void creare()
{
    int x,y;
    in>>x>>y;

    int a=rad(x),b=rad(y);
    if(rang[a]<rang[b])
    {
        rang[a]=rang[b]+1;
        parintare(a,y);
    }
    else
    {
        rang[b]=rang[a]+1;
        parintare(b,x);
    }
}

void verificare()
{
    int x,y,a,b;
    in>>x>>y;
    a=rad(x);
    b=rad(y);

    if(a==b)
    {
        out<<"DA";
        if(par[x]!=0 && par[x]!=a)
            par[x]=a;
        if(par[y]!=0 && par[y]!=b)
            par[y]=b;
    }
    else
        out<<"NU";
    out<<'\n';
}

int main()
{
    in>>n>>m;
    par.resize(n+1);
    rang.resize(n+1);

    for(int i=0; i<m; i++)
    {
        int x;
        in>>x;
        if(x==1)
            creare();
        else
            verificare();
    }

    return 0;
}