Cod sursa(job #2946632)

Utilizator alex_bb8Banilean Alexandru-Ioan alex_bb8 Data 25 noiembrie 2022 00:39:23
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

int father[100001], w[100001];

int get_set(int elem){
	if(father[elem] != elem)
		father[elem] = get_set(father[elem]);

	return father[elem];
}

void union_set(int x, int y){
	int left_set = get_set(x);
	int right_set = get_set(y);

	if(left_set != right_set){
		if(w[left_set] > w[right_set]){
			father[right_set] = left_set;
			w[left_set] += w[right_set];
		}
		else{
			father[left_set] = right_set;
			w[right_set] += w[left_set];
		}
	}
}

int main(){

	int n, m;

	f >> n >> m;

	for(int i = 1; i <= n; ++i)
		father[i] = i, w[i] = 1;

	for(int i = 1; i <= m; ++i){
		int c, x, y;
		f >> c >> x >> y;

		if(c == 1){
			union_set(x, y);
		}
		else{
			if(get_set(x) == get_set(y))
				g << "DA\n";
			else
				g << "NU\n";
		}
	}

	f.close();
	g.close();

	return 0;
}