Cod sursa(job #1704102)

Utilizator andreibotilaBotila Andrei andreibotila Data 18 mai 2016 00:56:34
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <stdio.h>
#include <queue>
#include <stdlib.h>
#include <algorithm>
#include <vector>

typedef struct Arb
{
	int parent, rank;
}Arbs;

int FindSet(int a, std::vector<Arbs*> arbsVect) {
	if (a != arbsVect[a]->parent) {
		arbsVect[a]->parent = FindSet(arbsVect[a]->parent, arbsVect);
	}
	return arbsVect[a]->parent;
}

Arbs * MakeSet(int i) {
	Arbs *arb = (Arbs*)malloc(sizeof(Arbs));
	arb->parent = i;
	arb->rank = 0;
	return arb;
}

void Union(int a, int b, std::vector<Arbs*> arbsVect) {
	int aParent, bParent;
	aParent = FindSet(a, arbsVect);
	bParent = FindSet(b, arbsVect);
	if (arbsVect[aParent]->rank > arbsVect[bParent]->rank) {
		arbsVect[bParent]->parent = aParent;
	} else {
		arbsVect[aParent]->parent = bParent;
	} 
	if (arbsVect[aParent]->rank == arbsVect[bParent]->rank) {
		arbsVect[bParent]->rank++;
		arbsVect[aParent]->parent = bParent;
	}
}

int main() {
	FILE *in = fopen("disjoint.in", "r");
	FILE *out = fopen("disjoint.out", "w");

	int N, M;
	fscanf(in, "%d %d", &N, &M);

	std::vector<Arbs*> arbsVect;	
	for (int i = 0; i < N; i++) {
		arbsVect.push_back(MakeSet(i));
	}

	for (int i = 0; i < M; i++) {
		int cod, x, y;
		
		fscanf(in, "%d %d %d", &cod, &x, &y);
		if (cod == 1) {
			Union(x - 1, y - 1, arbsVect);
		} else {
			if (FindSet(x - 1, arbsVect) != FindSet(y - 1, arbsVect)) {
				fprintf(out, "NU\n");
			} else {
				fprintf(out, "DA\n");
			}
		}
	}

	return 0;	
}