Cod sursa(job #2946285)

Utilizator Daniel7390Popescu Daniel Daniel7390 Data 24 noiembrie 2022 18:29:35
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

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

void initializareNumarNod(vector<int>& numarNod, int n) {

    for(int i = 1; i<= n; i++)
        numarNod.push_back(1);

}

void initializareTata(vector<int>& tata, int n) {

    for(int i = 0; i <= n; i++)
        tata.push_back(i);

}

void operatia1(int x, int y, vector<int>& tata, vector<int>& numarNod) {
    int radX, radY, radX1, radY1;

    fin>>x>>y;
    radX = radX1 = x;
    radY = radY1 = y;

    while (tata[radX]!=radX)
            radX=tata[radX];
    while (tata[radY]!=radY)
            radY=tata[radY];
    while (tata[radX1]!=radX1){
            radX1=tata[radX1];
            tata[radX1]=radX;
    }
    while (tata[radY1]!=radY1){
            radY1=tata[radY1];
            tata[radY1]=radY;
    }
    if (numarNod[radX]>=numarNod[radY])
            tata[radY]=radX;
        else
            tata[radX]=radY;

}

void operatia2(int x, int y, vector<int>& tata, vector<int>& numarNod) {
    int radX, radY, radX1, radY1;

    fin>>x>>y;
    radX = radX1 = x;
    radY = radY1 = y;

    while (tata[radX]!=radX)
            radX=tata[radX];
    while (tata[radY]!=radY)
            radY=tata[radY];
    if (radX==radY)
                fout <<"DA"<<'\n';
            else
                fout <<"NU"<<'\n';

    while (tata[radX1]!=radX1){
            radX1=tata[radX1];
            tata[radX1]=radX;
    }
    while (tata[radY1]!=radY1){
            radY1=tata[radY1];
            tata[radY1]=radY;
    }

}



int main()
{


    int n, m;
    fin>>n>>m;



    vector<int> tata;
    vector<int> numarNod;
    initializareNumarNod(numarNod,n);
    initializareTata(tata, n);


    for (int i=0; i<m; i++){
        int t,x,y;
        fin >>t;
        if (t==1){
            operatia1(x,y,tata,numarNod);

        }else{
            operatia2(x,y,tata,numarNod);
        }
    }

    for(int i = 0; i< n; i++)
        cout<<tata[i]<<" ";



    return 0;
}