Cod sursa(job #2697321)

Utilizator veresflorianveres ioan florian veresflorian Data 18 ianuarie 2021 10:37:40
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 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;
    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;
    if(rang[y]==0 && rang[x]==0)
        par[y]=x,rang[x]=2,rang[y]=1;
    else
    {
        int a=rad(x),b=rad(y);
        if(rang[a]<rang[b])
            parintare(a,y);
        else
            par[a]=b;
    }
}

void verificare()
{
    int x,y;
    in>>x>>y;
    if(rad(x)==rad(y))
        out<<"DA";
    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;
}