Cod sursa(job #2948381)

Utilizator 134_tufa_liliana_ionelaTufa Liliana Ionela 134_tufa_liliana_ionela Data 27 noiembrie 2022 17:39:03
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

int Cautare(int nod, vector<int>&radacina)
{
    if(radacina[nod]!=nod)
        radacina[nod]=Cautare(radacina[nod], radacina);
    return radacina[nod];
}

void Reuniune(int x, int y, vector<int>&radacina)
{
    int radx, rady;
    radx=Cautare(x, radacina);
    rady=Cautare(y, radacina);
    radacina[radx]=rady;
}
vector<int> CodDisjoint(vector <pair<int, pair<int, int>>>operatii, int N)
{
    vector <int> solutie;
    vector <int> radacina(N+1);
    for(int i=1;i<=N; i++)
        radacina[i]=i;
    for(int i=0; i < operatii.size();i++)
    {
        int op = operatii[i].first;
        int x = operatii[i].second.first;
        int y = operatii[i].second.second;
        if(op==1)
            Reuniune(x, y, radacina);
            else
        {
            if(Cautare(x, radacina)==Cautare(y, radacina))
                solutie.push_back(1);
            else
                solutie.push_back(0);
        }
    }
    return solutie;
}
int main()
{
    int N, M, op, x, y;
    f>>N>>M;
    vector <pair<int, pair<int, int>>>operatii;

    for(int i=0; i<M; i++)
    {
        f>>op>>x>>y;
        operatii.push_back(make_pair(op, make_pair(x, y)));
    }

    vector<int>afisare=CodDisjoint(operatii, N);

    for(auto i=0; i<afisare.size(); i++)
       {
        if(afisare[i]==1)
            g<<"DA"<<'\n';
        else
            g<<"NU"<<'\n';
       }
    f.close();
    g.close();
}