Cod sursa(job #2238613)

Utilizator b10nd3Oana Mancu b10nd3 Data 6 septembrie 2018 17:15:27
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include<iostream>
#include<fstream>

using namespace std;

int find(int x, int arb[]){
	int aux=x;
	while(arb[x]!=x) x=arb[x];
	
	//compresie
	while(aux!=arb[aux]){
		int tmp=arb[aux];
		arb[aux]=x;
		aux=tmp;
	}
	
	return x;
}

void unite(int x, int y, int arb[], int rng[]){
	if(rng[x]<rng[y]) arb[x]=y;
	else arb[y]=x;
	
	if(rng[x]==rng[y]) rng[x]++;
}


int main(){
	ifstream in("disjoint.in");
	FILE *out=fopen("disjoint.out","w");
	int i, n, m, op, x, y;
	in>>n>>m;
	int arb[n+2], rng[n+2];
	for(i=1;i<=n;i++){
		arb[i]=i; 
		rng[i]=1;
	}
	while(m--){
		in>>op>>x>>y;
		switch(op){
			case 1: {
				if(find(x,arb)!=find(y,arb)) unite(find(x,arb),find(y,arb), arb, rng);
				break;
			}
			case 2:{
				if(find(x,arb)==find(y,arb)) fprintf(out,"DA\n");
				else fprintf(out,"NU\n");
				break;
			}
			default: break;
		}
	}
	
	in.close(); fclose(out);
	return 0;
}