Cod sursa(job #757636)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 12 iunie 2012 19:58:19
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>

#define MAX 100050

using namespace std;

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

int tata[MAX], rang[MAX];

int find(int x)
{
    int R, comp;
    for(R = x; tata[R] != R; R = tata[R]);
    for(; comp != R;)
    {
        comp = tata[x];
        tata[x] = R;
        x = comp;
    }
    return R;
}

void merge(int x, int y)
{
    if(rang[x] > rang[y]) tata[y] = x;
    else tata[x] = y;
    if(rang[x] == rang[y]) rang[y]++;
}

int main()
{
    int n, m, op, x, y;
    in>>n>>m;
    for(int i = 1; i <= n; i++) {tata[i] = i; rang[i] = 1;}
    while(m--)
    {
        in>>op>>x>>y;
        switch(op)
        {
            case 1: merge(find(x), find(y)); break;
            case 2: if(find(x) == find(y)) out<<"DA\n"; else out<<"NU\n"; break;
        }
    }
    in.close(); out.close();
    return 0;
}