Cod sursa(job #1540239)

Utilizator fromzerotoheroFROM ZERO fromzerotohero Data 2 decembrie 2015 15:23:20
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <fstream>

using namespace std;

#define nmax 100001

ifstream fi("disjoint.in");
ofstream fo("disjoint.out");

int n, m;
int op, a, b;
int T[nmax], NR[nmax];

int root(int nod)
{
    if (nod == T[nod])
        return nod;
    return root(T[nod]);
}

int main()
{
    
    fi >> n >> m;
    
    // initialize
    for (int i = 1; i <= n; i++)
        T[i] = i, NR[i] = 1;
    
    for (int i = 1; i <= m; i++)
    {
        
        fi >> op >> a >> b;
        
        int r1 = root(a);
        int r2 = root(b);
        
        if (op == 1)
        {
            // reuniune
            
            if (NR[r1] >= NR[r2])
            {
                NR[r1] += NR[r2];
                T[r2] = r1;
            }
            else
            {
                NR[r2] += NR[r1];
                T[r1] = r2;
            }
            
        }
        else
        {
            // check
            
            if (r1 == r2)
                fo << "DA\n";
            else
                fo << "NU\n";
            
        }
        
    }
    
    
    
    fi.close();
    fo.close();
    
    return 0;
}