Cod sursa(job #373027)

Utilizator loginLogin Iustin Anca login Data 12 decembrie 2009 14:30:12
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
# include <cstdio>
# include <cstdlib>
using namespace std;
int *a[100002], n, m, t[100002], h[100002];

int rad (int x)
{
    int y, tmp;
    y=x;
    while (t[x]) x=t[x];
    while (y!=x)
        tmp=y, y=t[y], t[tmp]=x;
    return x;
}
 
void reuniune (int x, int y)
{
    int rx, ry;
    rx=rad(x);
    ry=rad(y);
    if (rx!=ry)
    {
         if (h[rx]>h[ry])
            t[ry]=rx;
        else
            if (h[rx]<h[ry])
                t[rx]=ry;
            else
                t[rx]=ry, h[ry]++;
    }
}

int main ()
{
	FILE *fin=fopen("disjoint.in", "r");
	FILE *fout=fopen("disjoint.out", "w");
	fscanf(fin, "%d", &n);
	fscanf(fin, "%d", &m);
	int c, x, y, i;
	for (i=1;i<=n;i++)
	{
		a[i]=(int *) malloc (4);
		a[i][0]=0;
	}
	for (;m;m--)
	{
		fscanf(fin, "%d %d %d", &c, &x, &y);
		if (c==1)
			reuniune(x, y);
		else
			if (rad(x)!=rad(y))
				fprintf(fout, "NU\n");
			else
				fprintf(fout, "DA\n");
	}
	return 0;
}