#pragma once #include <new> #include <stdexcept> class Set { public: //Set(); Set( int s ); ~Set(); void SimpleUnion( int i, int j ); int SimpleFind( int i ); void WeightedUnion( int i, int j ); int CollapsingFind( int i ); private: int* m_arr; int size; }; Set::Set(int s) : size( s ) { m_arr =newint[size]; if( m_arr == NULL ) throw std::bad_alloc("Allocation error in constructon!"); for( int i =0; i < size; i++ ) m_arr[i] =-1; } Set::~Set() { delete []m_arr; m_arr = NULL; } void Set::SimpleUnion( int i, int j )//这里一定要注意, union的parent!!!!! { m_arr[i] = j; } int Set::SimpleFind(int i) { while( m_arr[i] >=0 ) i = m_arr[i]; return i; } void Set::WeightedUnion( int i, int j ) { int temp = m_arr[i] + m_arr[j]; if( m_arr[i] < m_arr[j] ) { m_arr[j] = i; m_arr[i] = temp; } else { m_arr[i] = j; m_arr[j] = temp; } } int Set::CollapsingFind( int i ) { int r = i; while( m_arr[r] >=0 ) r = m_arr[r]; int s; while( i != r ) { s = m_arr[i]; m_arr[i] = r; i = s; } return r; }