Cod sursa(job #229364)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 9 decembrie 2008 22:52:28
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include<stdio.h>
#define N 100010
int n,m,i,dad[N],cod,a,b,la,lb,ca[N],cb[N];
void readd(),solve(),f1(),f2();
int main()
{
	readd();
	solve();
	return 0;
}
void readd()
{
	freopen("disjoint.in","rt",stdin);
	freopen("disjoint.out","wt",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)dad[i]=i;
}
void solve()
{
   for(;m;m--)
   { scanf("%d%d%d",&cod,&a,&b);
     if(cod==1)f1();else f2();
   }
}
void f1()
{ la=0;do{ ca[++la]=a;a=dad[a];}while(dad[a]-a);ca[++la]=a;
  lb=0;do{ cb[++lb]=b;b=dad[b];}while(dad[b]-b);cb[++lb]=b;
  a=(a<b)?a:b;
  for(i=1;i<=la;i++)dad[ca[i]]=a;
  for(i=1;i<=lb;i++)dad[cb[i]]=a;
}
void f2()
{
  la=0;do{ ca[++la]=a;a=dad[a];}while(dad[a]-a);ca[++la]=a;
  lb=0;do{ cb[++lb]=b;b=dad[b];}while(dad[b]-b);cb[++lb]=b;
  for(i=1;i<=la;i++)dad[ca[i]]=a;
  for(i=1;i<=lb;i++)dad[cb[i]]=b;
 if(a==b)printf("DA\n");
 else printf("NU\n");
}