Cod sursa(job #2452598)

Utilizator BovisioNitica Ionut Bogdan Bovisio Data 31 august 2019 14:01:20
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <cstdio>

using namespace std;

int n,m;

int grad[100020], tata[100020];

int find_father(int node){
	if(tata[node] == node){
		return node;
	}
	int ans = find_father(tata[node]);
	tata[node] = ans;
	return ans;
}

void unite(int node1, int node2){
	if(grad[node1] < grad[node2]){
		tata[node1] = node2;
		grad[node2] += grad[node1];
	}
	else{
		tata[node2] = node1;
		grad[node1] += grad[node2];
	}
}

int main(){
	FILE *f = fopen("disjoint.in","r");
	FILE *g = fopen("disjoint.out","w");

	fscanf(f,"%d %d",&n,&m);

	int o, aux1, aux2;

	for(int i=1;i<=n;i++){
		tata[i] = i;
		grad[i] = 1;
	}

	for(int i=0;i<m;i++){
		fscanf(f,"%d %d %d",&o, &aux1, &aux2);
		if(o == 2){
			if(find_father(aux1) == find_father(aux2)){
				fprintf(g,"DA\n");
			}
			else{
				fprintf(g,"NU\n");
			}
		}
		else{
			if(find_father(aux1) == find_father(aux2)){
				return 0;
			}
			unite(find_father(aux1), find_father(aux2));
		}
	}

	return 0;
}