Cod sursa(job #749847)

Utilizator danieladDianu Daniela danielad Data 19 mai 2012 11:07:16
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include<iostream>
#include<fstream>
using namespace std;
const int nmax=100001;
int T[nmax],rang[nmax];
void makeset(int x){
	T[x]=x;
	rang[x]=1;
}
void reuniune(int x,int y){
	if(rang[x]>rang[y])
		T[y]=x;
	else
		if(rang[y]>rang[x])
			T[x]=y;
	else
		if(rang[x]==rang[y]){
			T[x]=y;
			rang[y]++;
		}
}
int radacina(int x){
	int i,aux;
	for(i=x;i!=T[i];i=T[i]);
	while(x!=T[x]){
		aux=T[x];
		T[x]=i;
		x=aux;
	}
	return i;
}
int main(){
	ifstream f("disjoint.in");
	ofstream g("disjoint.out");
	int n,m,operatie,x,y;
	f>>n>>m;
	for(int i=1;i<=n;i++)
		makeset(i);
	for(int i=1;i<=m;i++){
		f>>operatie>>x>>y;
		if(operatie==1)
			reuniune(radacina(x),radacina(y));
		if(operatie==2)
			if(radacina(x)==radacina(y))
				g<<"DA\n";
			else
				g<<"NU\n";
	}
	f.close();
	g.close();
	return 0;
}