Cod sursa(job #1016720)

Utilizator sziliMandici Szilard szili Data 26 octombrie 2013 17:32:31
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

typedef struct node{
    struct node *parent;
    int value;
    int nodeRank;
} NODE;

NODE * nodes[100001];
int n,m;

NODE *findSet(NODE *p){

    if (p == p->parent){
        return p;
    } else {
        p->parent = findSet(p->parent);
        return p->parent;
    }
}


void union_set(NODE *p1, NODE *p2){
    NODE *repr1 = findSet(p1);
    NODE *repr2  = findSet(p2);

    if (repr1->nodeRank > repr2->nodeRank){
        repr2->parent = repr1;
    } else if (repr2->nodeRank > repr1->nodeRank){
        repr1->parent = repr2;
    } else {
        repr1->parent = repr2;
        repr2->nodeRank = repr2->nodeRank + 1;
    }
}

int areInSameSet(NODE *p1, NODE *p2){
    NODE *repr1 = findSet(p1);
    NODE *repr2  = findSet(p2);

    if (repr1->value == repr2->value){
        return 1;
    }
    else {
        return 0;
    }
}

void performOperation(int op, int elem1, int elem2){

    switch(op){

    case 1:
        union_set(nodes[elem1], nodes[elem2]);
        break;

    case 2:
        if (areInSameSet(nodes[elem1], nodes[elem2])){
            printf("DA\n");
        } else {
            printf("NU\n");
        }
        break;
    }

}

void initSets(){

    for (int i=1; i<=n; i++){
        NODE *p = (NODE *) malloc(sizeof(NODE));
        p->value = i;
        p->parent = p;
        p->nodeRank = 0;

        nodes[i] = p;
    }

}

int main()
{
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);

    scanf("%d %d", &n, &m);

    initSets();

    int op, elem1, elem2;
    for (int i=0; i<m; i++){
        scanf("%d %d %d", &op, &elem1, &elem2);
        performOperation(op, elem1, elem2);
    }

    return 0;
}