Cod sursa(job #1944179)

Utilizator vlcmodanModan Valentin vlcmodan Data 28 martie 2017 23:12:54
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include<cstdio>

int i, n, m, t[100010], r[100010];

int gas(int x)
{
	int rad;

	for (rad = x; rad != t[rad]; rad = t[rad]);

	while (x != t[x])
	{
		int aux = t[x];
		t[x] = rad;
		x = aux;
	}

	return rad;
}

void uneste(int x, int y)
{
	if (r[x]<r[y])
		t[x] = y;
	else
		t[y] = x;

	if (r[x] == r[y]) r[x]++;
}

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

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

	for (i = 1; i <= n; ++i)
	{
		t[i] = i;
		r[i] = 1;
	}

	for (i = 1; i <= m; ++i)
	{
		int tip, x, y;
		scanf("%d%d%d", &tip, &x, &y);

		if (tip == 1)  uneste(gas(x), gas(y));
		else
		{
			if (gas(x) == gas(y)) printf("DA\n");
			else printf("NU\n");
		}
	}

	fclose(stdin);
	fclose(stdout);

	return 0;
}