Cod sursa(job #372648)

Utilizator johsonsbabiJohnsons Babi Minune johsonsbabi Data 11 decembrie 2009 06:42:09
Problema Paduri de multimi disjuncte Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.74 kb
#include <stdio.h>
FILE*f=fopen("disjoint.in","r");
FILE*g=fopen("disjoint.out","w");
int tt[100020],n,m;
int rg[100020];


int find(int x){
	int tatel;
	tatel=x;
	while(tt[tatel]!=tatel)
		tatel=tt[tatel];
	int y;
	while(tt[x]!=tatel){
		y=tt[x];
		tt[x]=tatel;
		x=y;
	}
	return tatel;
}

void unite(int x,int y){
	if(rg[x] > rg[y])
		tt[y]=x;
	else tt[x]=y;
	if(rg[x]==rg[y]) rg[y]++;
}

int main(){	
	fscanf(f,"%d %d",&n,&m);
	int i,x,y,tip;
	for(i=1;i<=n;i++){
		tt[i]=i;
		rg[i]=1;
	}
	for(i=1;i<=m;i++){
		fscanf(f,"%d %d %d",&tip,&x,&y);
		if(tip==2)
			if(find(x) == find(y)) fprintf(g,"DA\n");
			else fprintf(g,"NU\n");
		else
			unite(find(x),find(y));
	}	
	fclose(f);
	fclose(g);
	return 0;
}