Cod sursa(job #353258)

Utilizator otilia_sOtilia Stretcu otilia_s Data 4 octombrie 2009 15:33:28
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <stdio.h>
#define NMAX 100024
int tata[NMAX],rang[NMAX];

int find(int x)
{
 int rad=x,aux;
 while (tata[rad]!=rad)
  rad=tata[rad];
 while(x!=tata[x])
  { aux=tata[x]; tata[x]=rad; x=aux;}
 return rad;  
}

void uneste(int a,int b)
{
 if (rang[a]>rang[b]) tata[b]=a;
    else tata[a]=b;
 if (rang[a]==rang[b])rang[b]++;
}

int main()
{
 FILE *fin=fopen("disjoint.in","r");
 FILE *fout=fopen("disjoint.out","w");
 int n,m,x,y,op,count,i;
 fscanf(fin,"%d%d",&n,&m); 
 for (i=1;i<=n;++i) { tata[i]=i; rang[i]=1;}
 for (count=0;count<m;++count)
  {
	fscanf(fin,"%d%d%d",&op,&x,&y);
	if (op==2)
		{
		 if (find(x)==find(y)) fprintf(fout,"DA\n");
		    else fprintf(fout,"NU\n");
		}
	   else uneste(find(x),find(y));
  } 
 fclose(fin);fclose(fout);
 return 0;
}