Cod sursa(job #934369)

Utilizator whoasdas dasdas who Data 30 martie 2013 15:52:20
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include "string.h"

using namespace std;

int n, m;
int *parent;
int *rank;

inline int rep(int x)
{
    int i, rep, p;

    i = x;
    while (parent[i] != -1)
        i = parent[i];
    rep = i;

    /* flattening optimization */
    i = x;
    while (parent[i] != -1) {
        p = parent[i];
        parent[i] = rep;
        i = p;
    }
    return rep;
}

inline void unite(int x, int y)
{
    int repx, repy;
    repx = rep(x);
    repy = rep(y);

    if (rank[repx] > rank[repy]) {
        parent[repy] = repx;
    } else if (rank[repx] < rank[repy]) {
        parent[repx] = repy;
    } else {
        parent[repx] = repy;
        rank[repy]++;
    }
}



int main()
{
    ifstream in("disjoint.in");
    ofstream out("disjoint.out");
    in>>n>>m;
    parent = new int[n];
    rank = new int[n];
    memset(parent, -1, n*sizeof(int));
    memset(rank, 0, n*sizeof(int));

    int op, x, y;
    while (m-->0) {
        in>>op>>x>>y;
        x--; y--;
        switch (op) {
            case 1:
                unite(x, y);
                break;
            case 2:
                if (rep(x) == rep(y))
                    out<<"DA"<<endl;
                else
                    out<<"NU"<<endl;
                break;
        }
    }
    return 0;
}