Cod sursa(job #1704104)

Utilizator andreibotilaBotila Andrei andreibotila Data 18 mai 2016 01:18:54
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <iostream>
#include <stdio.h>
#include <vector>

std::vector<int> parent, rank;

int FindSet(int a) {
	if (a != parent[a]) {
		parent[a] = FindSet(parent[a]);
	}
	return parent[a];
}

void Union(int a, int b) {
	int aParent, bParent;
	aParent = FindSet(a);
	bParent = FindSet(b);
	if (rank[aParent] > rank[bParent]) {
		parent[bParent] = aParent;
	} else if (rank[aParent] < rank[bParent]){
		parent[aParent] = bParent;
	} else {
		parent[aParent] = bParent;
		rank[bParent]++;
	}
}

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

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

	for (int i = 0 ; i < N; i++) {
		parent.push_back(i);
		rank.push_back(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, y);
		} else {
			if (FindSet(x) == FindSet(y)) {
				fprintf(out, "DA\n");
			} else {
				fprintf(out, "NU\n");
			}
		}
	}

	return 0;	
}