Cod sursa(job #1650318)

Utilizator somuBanil Ardej somu Data 11 martie 2016 17:39:45
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <fstream>

#define nmax 100001

using namespace std;

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

int n, m;
int i, j, op, x, y;
int T[nmax], NR[nmax];

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

void join(int x, int y)
{
    
    int r1 = root(x);
    int r2 = root(y);
    
    if (r1 == r2) return;
    
    if (NR[r1] >= NR[r2])
    {
        T[r2] = r1;
        NR[r1] += NR[r2];
    }
    else
    {
        T[r1] = r2;
        NR[r2] += NR[r1];
    }
    
}

void query(int x, int y)
{
    int r1 = root(x);
    int r2 = root(y);
    
    if (r1 == r2)
        fo << "DA\n";
    else
        fo << "NU\n";
}

int main()
{
    
    fi >> n >> m;
    
    for (i = 1; i <= n; i++)
        T[i] = i, NR[i] = 1;
    
    for (i = 1; i <= m; i++)
    {
        
        fi >> op >> x >> y;
        
        switch(op) {
            case 1:
                join(x, y);
                break;
            case 2:
                query(x, y);
                break;
        }
        
    }
    
    fi.close();
    fo.close();
    
    return 0;
}