Cod sursa(job #1931582)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 19 martie 2017 14:01:52
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstdio>
#include <algorithm>

using namespace std;

class Disjoint{
private:
	int parinti[100005];
	int adancimi[100005];
	int n;
	
	int findRoot(int x)
	{
		int xx = x;
		
		while(parinti[xx] != xx)
		{
			xx = parinti[xx];
		}

		int tmp;

		while(parinti[x] != x)
		{
			tmp = parinti[x];
			parinti[x] = xx;
			x = tmp;
		}

		return xx;
	}

public:
	Disjoint(int _n)
	{
		n = _n;

		for(int i = 0; i <= n; i++)
		{
			parinti[i] = i;
			adancimi[i] = 1;
		}	
	}

	bool sameTree(int x, int y)
	{
		if(findRoot(x) == findRoot(y))
		{
			return true;
		}		
		return false;
	}

	void unire(int x, int y)
	{
		int tata1 = findRoot(x);
		int tata2 = findRoot(y);

		if(adancimi[tata1] == adancimi[tata2])
		{
			parinti[tata1] = tata2;
			adancimi[tata2]++;
		}
		else if(adancimi[tata1] < adancimi[tata2])
		{
			parinti[tata1] = tata2;
		}
		else
		{
			parinti[tata2] = tata1;
		}	
	}

};

int main()
{
	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);

	int n, m;
   	scanf("%d %d", &n, &m);

	Disjoint multime1 = Disjoint(n);

	int tmp1, tmp2, tmp3;

	for(int k = 0; k < m; k++)
	{
		scanf("%d %d %d", &tmp1, &tmp2, &tmp3);

		if(tmp1 == 1)
		{
			multime1.unire(tmp2, tmp3);
		}
		else if(tmp1 == 2)
		{
			if(multime1.sameTree(tmp2, tmp3) == true)
			{
				printf("DA\n");
			}
			else
			{
				printf("NU\n");
			}
		}
		else
		{
			printf("WTF DUDE?");
		}
	}	
		

	return 0;
}