Cod sursa(job #2390617)

Utilizator Natasa_CirsteaCirstea Natasa Alexandra Natasa_Cirstea Data 28 martie 2019 11:08:43
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <vector>

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

int reprezentant(int a,vector<int>&parinte)
{
    if(a==parinte[a])
        return a;
    return reprezentant(parinte[a],parinte);
}

bool verifica(int a,int b,vector<int>&parinte)
{
    return reprezentant(a,parinte)!=reprezentant(b,parinte);
}

void uneste(int a,int b,vector<int>&adancime,vector<int>&parinte)
{
    int repa=reprezentant(a,parinte);
    int repb=reprezentant(b,parinte);

    if(adancime[repa]<adancime[repb])
        parinte[repa]=repb;
    else
        parinte[repb]=repa;

    if(adancime[repa]==adancime[repb])
        adancime[repa]++;
}

int main()
{
    int n,m,i,cod,x,y;
    f>>n>>m;
    vector<int>parinte(n+1);
    vector<int>adancime(n+1,0);

    for(i=0; i<=n; i++)
        parinte[i]=i;

    for(i=1; i<=m; i++)
    {
        f>>cod>>x>>y;
        if(cod==1)
        {
            if(verifica(x,y,parinte))
                uneste(x,y,adancime,parinte);
            else
                g<<"Nu fac parte din multimi disjuncte!\n";
        }
        else if(reprezentant(x,parinte)==reprezentant(y,parinte))
            g<<"DA\n";
        else
            g<<"NU\n";
    }
    return 0;
}