// GROUP: 3
// ID: 20150181
// Assign: 02
// Assign: DisjointSets
// UVA: 10608
// Name: Amr Tarek Mahmoud
// UVA Handle: Amr_Tarek
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct DisjointSets
{
int n;
int * parent;
int * num_nodes;
void Initialize( int _n) {
n = _n;
parent = new int [ n] ;
num_nodes = new int [ n] ;
for ( int i= 0 ; i< n ; i++ ) {
parent[ i] = i;
num_nodes[ i] = 1 ;
}
}
void Destroy( ) {
delete [ ] parent;
delete [ ] num_nodes;
}
int Find( int i) {
if ( parent[ i] == i) return i;
return parent[ i] = Find( parent[ i] ) ;
}
bool Union( int i, int j) {
int a = Find( i) , b = Find( j) ;
if ( a == b) return false ;
else {
if ( num_nodes[ a] > num_nodes[ b] )
parent[ b] = a;
else parent[ a] = b;
}
return true ;
}
} ;
////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main( )
{
DisjointSets tree;
tree.Initialize ( 10 ) ;
for ( int i= 0 ; i< 10 ; i++ ) {
cout << parent[ i] << endl;
}
cout << endl;
tree.Union ( 3 ,7 ) ;
cout << parent[ 3 ] << ' ' << parent[ 7 ] << endl;
return 0 ;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
Ly8gR1JPVVA6ICAgMwovLyBJRDogICAgICAyMDE1MDE4MQovLyBBc3NpZ246ICAwMgovLyBBc3NpZ246ICBEaXNqb2ludFNldHMKLy8gVVZBOiAgICAgMTA2MDgKLy8gTmFtZTogICAgQW1yIFRhcmVrIE1haG1vdWQKLy8gVVZBIEhhbmRsZTogQW1yX1RhcmVrCgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKc3RydWN0IERpc2pvaW50U2V0cwp7CglpbnQgbjsKCWludCogcGFyZW50OwoJaW50KiBudW1fbm9kZXM7CgoJdm9pZCBJbml0aWFsaXplKGludCBfbil7CgkJbiA9IF9uOwoJCXBhcmVudCA9IG5ldyBpbnQgW25dOwoJCW51bV9ub2RlcyA9IG5ldyBpbnQgW25dOwoJCWZvcihpbnQgaT0wIDsgaTxuIDsgaSsrKXsKCQkJcGFyZW50W2ldID0gaTsKCQkJbnVtX25vZGVzW2ldID0gMTsKCQl9Cgl9Cgl2b2lkIERlc3Ryb3koKXsKCQlkZWxldGUgW11wYXJlbnQ7CgkJZGVsZXRlIFtdbnVtX25vZGVzOwoJfQoJaW50IEZpbmQoaW50IGkpewoJCWlmKHBhcmVudFtpXSA9PSBpKXJldHVybiBpOwogICAgCXJldHVybiBwYXJlbnRbaV0gPSBGaW5kKHBhcmVudFtpXSk7Cgl9Cglib29sIFVuaW9uKGludCBpLCBpbnQgail7CgkJaW50IGEgPSBGaW5kKGkpICwgYiA9IEZpbmQoaik7CgkJaWYoYSA9PSBiKXJldHVybiBmYWxzZTsKCQllbHNlewoJCQlpZihudW1fbm9kZXNbYV0gPiBudW1fbm9kZXNbYl0pCgkJCQlwYXJlbnRbYl0gPSBhOwoJCQllbHNlIHBhcmVudFthXSA9IGI7CgkJfQoJCXJldHVybiB0cnVlOwoJfQp9OwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgppbnQgbWFpbigpCnsKCURpc2pvaW50U2V0cyB0cmVlOwoJdHJlZS5Jbml0aWFsaXplKDEwKTsKCWZvcihpbnQgaT0wIDsgaTwxMCA7IGkrKyl7CgkJY291dDw8cGFyZW50W2ldPDxlbmRsOwoJfQoJY291dDw8ZW5kbDsKCXRyZWUuVW5pb24oMyw3KTsKCWNvdXQ8PHBhcmVudFszXTw8JyAnPDxwYXJlbnRbN108PGVuZGw7CgoJcmV0dXJuIDA7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwo=