Cod sursa(job #2397155)

Utilizator tudose_bogdanTudose Bogdan tudose_bogdan Data 4 aprilie 2019 11:12:27
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct comp{
 int parinte;
 int  rang;
};
int gasesteParinte(vector<comp> &p, int i)
{
    if(p[i].parinte!=i)
        p[i].parinte=gasesteParinte(p,p[i].parinte);
    return p[i].parinte;

}

void Union(vector<comp> &p, int x, int y)
{
    int xset = gasesteParinte(p, x);
    int yset = gasesteParinte(p, y);


    if(p[xset].rang<p[yset].rang)
        p[xset].parinte=yset;
    else if(p[xset].rang>p[yset].rang)
    p[yset].parinte=xset;

        if(p[xset].rang==p[yset].rang)
        {
            p[xset].parinte=yset;
            p[xset].rang++;
        }

}





int main()
{
   int n,m;

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

     f>>n>>m;
     int op,op1,op2;

    vector<comp> componente(n+1);
    for(int i=1;i<=n;i++)
    {
        componente[i].parinte=i;
        componente[i].rang=0;
    }

    for(int i=0;i<m;i++)
    {
        f>>op>>op1>>op2;
        switch(op)
        {
        case 1:
            {
                if(gasesteParinte(componente,op1)!=gasesteParinte(componente,op2))
                Union(componente,op1,op2);
                    break;
            }
        case 2:
            {
                if(gasesteParinte(componente,op1)==gasesteParinte(componente,op2))
                    g<<"DA"<<endl;
                else g<<"NU"<<endl;
                break;
            }

        }
    }

    return 0;
}