Cod sursa(job #388681)

Utilizator BaduBadu Badu Badu Data 30 ianuarie 2010 18:36:34
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.74 kb
#include<fstream>
#define max 100001

using namespace std;

int n,m;
int Tata[max];
int Rang[max];

void unin( int x, int y){
	if( Rang[x] > Rang[y] ) Tata[y] = x;
	else {Tata[x] = y;
		  if( Rang[x] == Rang[y]) Rang[y] ++;
	}
}


int root ( int x){
	int r = Tata[x],t;	
	while( r!=Tata[r] ) r = Tata[r];
		for( ; r != x ; ){
			t = Tata[x];
			Tata[x] = r;
			
			x=t;
		}
		
	return r;
}


int main(){
	
	ifstream f("disjoint.in");
	ofstream g("disjoint.out");
	
	f>>n>>m;
	int i,o,x,y;
	for(i=1;i<=n;i++){ Tata[i]=i; Rang[i]=1; }
	
	for( ; m ; --m ){
		
		f>>o>>x>>y;
		if ( o==1 ) unin(find(x),find(y));
		else if( o== 2){ 
			if( root(x) == root(y) ) g<<"DA\n";
			else g<<"NU\n";
		}
	}
	return 0;
}