Cod sursa(job #3218555)

Utilizator george_buzasGeorge Buzas george_buzas Data 27 martie 2024 12:54:16
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <cstring>
#define NR_MAX_NODES 100000
using namespace std;

// value of the query is 1 - unify the 2 components if necessary
// value of the query is 2 - specify whether the 2 nodes belong to the same component or not

int parents[NR_MAX_NODES + 1];

int findParents(int node) {
	if (parents[node] < 0) {
		return node;
	}
	return findParents(parents[node]);
}

void unifyComponents(int parent1, int parent2) {
	if (-parents[parent1] >= -parents[parent2]) {
		parents[parent1] += parents[parent2];
		parents[parent2] = parent1;
	} else {
		parents[parent2] += parents[parent1];
		parents[parent1] = parent2;
	}
}

int main() {
	ifstream fin("disjoint.in");
	fin.tie(0);
	ofstream fout("disjoint.out");
	memset(parents, -1, sizeof parents);
	int nrNodes, nrQueries;
	fin >> nrNodes >> nrQueries;
	while (nrQueries--) {
		int operationType, node1, node2;
		fin >> operationType >> node1 >> node2;
		int parent1 = findParents(node1);
		int parent2 = findParents(node2);
		if (operationType == 1) {
			if (parent1 != parent2) {
				unifyComponents(parent1, parent2);
			}
		} else {
			if (parent1 == parent2) {
				fout << "DA\n";
			} else {
				fout << "NU\n";
			}
		}
	}
	return 0;
}