Cod sursa(job #1760445)

Utilizator andreioneaAndrei Onea andreionea Data 20 septembrie 2016 20:13:25
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <list>
#include <unordered_map>
#include <utility>

struct file_manip {

	std::ifstream fin;
	std::ofstream fout;

	file_manip(const char* filename) {
		std::string infilename  = std::string(filename) + ".in";
		std::string outfilename = std::string(filename) + ".out";
		fin.open(infilename.c_str());
		fout.open(outfilename.c_str());
	}

	template <class T>
	file_manip& operator << (const T& rhs) {
		fout << rhs;
		return *this;
	}
	template <class T>
	file_manip& operator >> (T& rhs) {
		fin >> rhs;
		return *this;
	}
};
struct DS
{
	std::unordered_map<int, std::list<int>> forrest;
	std::vector<int> indices;
	DS(int N)
	{
		indices.reserve(N+1);
		int x = 0;
		std::generate_n(indices.begin(), N + 1, [&x]() { return x++;});
		x = 1;
		for (x = 1; x <= N; ++x)
		{
			std::list<int> s{x};
			forrest[x] = s;
		}
	}
	void Associate(int x, int y)
	{
		const auto id1 = indices[x];
		const auto id2 = indices[y];
		if (id1 == id2)
			return;
		auto& s1 = forrest[id1];
		auto& s2 = forrest[id2];
		if (s1.size() <= s2.size())
		{
			for (const auto i : s2){
				indices[i] = id1;
			}
			s1.splice(s1.end(), s2);
		}
		else
		{	
			for (const auto i : s1){
				indices[i] = id2;
			}	
			s2.splice(s1.end(), s1);
		}
	}
	bool AreTheSame(int x, int y) const
	{
		return indices[x] == indices[y];
	}
};
int main()
{
	file_manip fm("disjoint");
	int N, M, op, x, y;
	fm >> N >> M;
	DS ds(N);
	while (M--)
	{
		fm >> op >> x >> y;
		if (op == 1){
			ds.Associate(x,y);
		}
		else {
			if (ds.AreTheSame(x,y))
			{
				fm << "DA\n";
			}
			else
			{
				fm << "NU\n";
			}
		}
	}
	return 0;
}