Cod sursa(job #2944656)

Utilizator Rares_StefanoiuRares Stefanoiu Rares_Stefanoiu Data 22 noiembrie 2022 20:07:21
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.86 kb
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int i, n, m, op, x, y;
vector<int>parent;
vector<int>rang;
ifstream f("disjoint.in");
ofstream g("disjoint.out");

int find(int x)
{
	while (parent[x] != x)
	{
		parent[x] = parent[parent[x]];
		x = parent[x];
	}
	return x;
}

void reuniune(int x, int y) {
	int i = find(x);
	int j = find(y);
	if (rang[i] > rang[j])
	{
		parent[j] = parent[i];
		rang[i]++;
	}
	else
	{
		parent[i] = parent[j];
		rang[j]++;
	}
}

int main() {
	f >> n >> m;
	parent.resize(n + 1);
	rang.resize(n+1);
	for (i = 1; i <= n; i++)
	{
		parent[i] = i;
		rang[i] = 1;
	}
	for(i=1;i<=m;i++)
	{
		f >> op;
		if (op == 1) {
			f >> x >> y;
			reuniune(x, y);

		}
		else {
			f >> x >> y;
			if (find(x) == find(y))
				g << "DA\n";
			else
				g << "NU\n";

		}
	}
}