Cod sursa(job #2422562)

Utilizator StefanIonescuStefan Ionescu StefanIonescu Data 19 mai 2019 10:59:44
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.91 kb
#include <stdio.h>

#define NMAX 100020

int TT[NMAX], RG[NMAX];
int N, M;
int find(int x)
{
   int R;
   for(R=x;TT[R]!=R;R=TT[R]);
   while(x!=R)
   {
       int y=TT[x];
       TT[x]=R;
       x=y;
   }
   return R;
}
void unite(int x,int y)
{
    if(RG[x]<RG[y])
    {
       TT[x]=y;
    }
    else
    {
      TT[y]=x;
    }
    if(RG[x]==RG[y])
       RG[y]++;
}
int main()
{
	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);

	scanf("%d %d ", &N, &M);

	int i, x, y, cd;
    for(i=1;i<=N;i++)
    {
       TT[i]=i;
       RG[i]=1;
    }
    for(i=1;i<=M;i++)
    {
       scanf("%d %d %d", &cd, &x, &y);
       if(cd==2)
       {
           if (find(x) == find(y)) printf("DA\n");
				else printf("NU\n");
       }
       else
       {
           unite(find(x),find(y));
       }
    }
    return 0;
	//initial fiecare nod pointeaza catre el insusi iar rangul fiecarui arbore este 1


	return 0;
}