Cod sursa(job #1457628)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 3 iulie 2015 19:31:26
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <fstream>
#include <vector>
#include <numeric>
#include <utility>
using namespace std;

class union_find{
	vector<int> par, adanc;
public:
	union_find(const int a):
		par(a), adanc(a, 1){
		iota(begin(par), end(par), 0); }
	int find(int a){
		static vector<int> v;
		while(a != par[a]){
			v.push_back(a);
			a = par[a]; }
		for(const auto x : v){
			par[x] = a; }
		v.clear();
		return a; }
	bool same(const int a, const int b){
		return find(a) == find(b); }
	void merge(int a, int b){
		a = find(a), b = find(b);
		if(adanc[a] == adanc[b]){
			++adanc[b]; }
		else if(adanc[a] > adanc[b]){
			swap(a, b); }
		par[a] = b; } };

int main(){
	ifstream f("disjoint.in");
	ofstream g("disjoint.out");
	int n, m;
	f >> n >> m;
	union_find uf(n);
	for(int i = 0, a, b, c; i < m; ++i){
		f >> a >> b >> c;
		--b, --c;
		switch(a){
		case 1:
			uf.merge(b, c);
			break;
		case 2:
			g << (uf.same(b, c) ? "DA\n" : "NU\n");
			break; } }
	return 0; }