Cod sursa(job #235371)

Utilizator vlad.maneaVlad Manea vlad.manea Data 23 decembrie 2008 16:29:13
Problema Paduri de multimi disjuncte Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.02 kb
#include <stdio.h>
#define nmax 100009

int N, M, dad[nmax];

void unIon(int x, int y)
{
	int i, j, ti, tj, k;
	for (i = x, ti = dad[x]; ti > 0; i = ti, ti = dad[i]);
	for (j = y, tj = dad[y]; tj > 0; j = tj, tj = dad[j]);

	if (i == j) return;

	if (dad[i] < dad[j]) 
		for (dad[j] = i, j = y; j != i; k = dad[j], dad[j] = i, j = k);
	else if (dad[i] > dad[j])
		for (dad[i] = j, i = x; i != j; k = dad[i], dad[i] = j, j = k);
	else 
		for (dad[i]--, dad[j] = i, j = y; j != i; k = dad[j], dad[j] = i, j = k);
}

int doiIoni(int x, int y)
{
	int i, j, ti, tj;
	for (i = x, ti = dad[x]; ti > 0; i = ti, ti = dad[i]);
	for (j = y, tj = dad[y]; tj > 0; j = tj, tj = dad[j]);
	return i == j;
}

int main()
{
	int i, t, x, y;

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

	for (scanf("%d", &N), i = 1; i <= N; dad[i] = -1, ++i);
	for (scanf("%d", &M); M; M--)
	{
		scanf("%d%d%d", &t, &x, &y);
		t == 1? unIon(x, y): printf(doiIoni(x, y)? "DA\n": "NU\n");
	}

	return 0;
}