Cod sursa(job #1462775)

Utilizator metrix007Lungu Ioan Adrian metrix007 Data 18 iulie 2015 22:57:58
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <iostream>
#include <fstream>
#define NMAX 100005
using namespace std;

int A[NMAX],R[NMAX],n,m,x,y,nr;

int fin(int x)
{
    int r,aux;
    for(r=x;A[r]!=r;r=A[r]);

    for(;A[x]!=x;)
    {
        aux = A[x];
        A[x] = r;
        x=aux;
    }
    return r;
}

void uni(int r1, int r2)
{
    if(R[r1]>R[r2])
        A[r2] = r1;
    else
        A[r1] = r2;

    if(R[r1]==R[r2])
        R[r2]++;
}

int main()
{
    ifstream in("disjoint.in");
    ofstream out("disjoint.out");
    in >> n >> m;
    for(int i=1;i<=n;i++)
    {
        A[i]=i;
        R[i]=1;
    }
    for(int i=0;i<m;i++)
    {
        in >> nr >> x >> y;
        if(nr==2)
            if(fin(x)==fin(y)) out << "DA" << "\n";
                    else out << "NU" << "\n";
        else
            uni(fin(x),fin(y));

    }
    return 0;
}