Cod sursa(job #2423933)

Utilizator Madalina_CirsteaCIRSTEA IONELA-MADALINA Madalina_Cirstea Data 22 mai 2019 10:55:15
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
ifstream f ("disjoint.in");
ofstream g ("disjoint.out");

int reprezentant (int x,vector<int>&repr)
{
    if (x==repr[x])
        return x;
    else
        return repr[x]=reprezentant(repr[x],repr);
}

void reuneste(int x,int y,vector<int>&repr,vector<int>&adancime)
{
    int rep_x=reprezentant(x,repr);
    int rep_y=reprezentant(y,repr);

    if (adancime[rep_x]<adancime[rep_y])
        repr[rep_x]=rep_y;
    else
        repr[rep_y]=rep_x;

    if (adancime[rep_x]==adancime[rep_y])
        adancime[rep_x]++;
}

bool verifica (int x,int y,vector<int>&repr)
{
    return reprezentant(x,repr)==reprezentant(y,repr);
}

int main()
{
    int n,m,x,y,cod;

    f>>n>>m;

    vector<int>repr(n+1);
    vector<int>adancime(n+1,0);

    for (int i=1; i<=n; i++)
        repr[i]=i;

    for (int i=0; i<m; i++)
    {
        f>>cod>>x>>y;

        if (cod==1)
            reuneste(x,y,repr,adancime);
        else if (cod==2)
        {
            if (verifica(x,y,repr))
                g<<"DA\n";
            else
                g<<"NU\n";
        }
    }
}