我写的并查集[涂鸦]
2007-01-10 12:08 老博客哈 阅读(658) 评论(1) 收藏 举报 #pragma once
#pragma once 
 #include <new>
#include <new> #include <stdexcept>
#include <stdexcept>

 class Set
class Set {
{ public:
public: //Set();
    //Set(); Set( int s );
    Set( int s ); ~Set();
    ~Set(); void SimpleUnion( int i, int j );
    void SimpleUnion( int i, int j ); int SimpleFind( int i );
    int SimpleFind( int i ); void WeightedUnion( int i, int j );
    void WeightedUnion( int i, int j ); int CollapsingFind( int i );
    int CollapsingFind( int i ); private:
private: int * m_arr;
    int * m_arr; int size;
    int size; };
};

 Set::Set(int s) : size( s )
Set::Set(int s) : size( s ) {
{ m_arr = new int[size];
    m_arr = new int[size]; if( m_arr == NULL )
    if( m_arr == NULL ) throw std::bad_alloc("Allocation error in constructon!");
        throw std::bad_alloc("Allocation error in constructon!"); for( int i = 0; i < size; i++ )
    for( int i = 0; i < size; i++ ) m_arr[i] = -1;
        m_arr[i] = -1; }
}

 Set::~Set()
Set::~Set() {
{ delete []m_arr;
    delete []m_arr; m_arr = NULL;
    m_arr = NULL; }
}

 void Set::SimpleUnion( int i, int j )//这里一定要注意, union的parent!!!!!
void Set::SimpleUnion( int i, int j )//这里一定要注意, union的parent!!!!! {
{ m_arr[i] = j;
    m_arr[i] = j; }
}

 int Set::SimpleFind(int i)
int Set::SimpleFind(int i) {
{ while( m_arr[i] >= 0 )
    while( m_arr[i] >= 0 ) i = m_arr[i];
        i = m_arr[i]; return i;
    return i; }
}

 void Set::WeightedUnion( int i, int j )
void Set::WeightedUnion( int i, int j ) {
{ int temp = m_arr[i] + m_arr[j];
    int temp = m_arr[i] + m_arr[j]; if( m_arr[i] < m_arr[j] )
    if( m_arr[i] < m_arr[j] ) {
    { m_arr[j] = i;
        m_arr[j] = i; m_arr[i] = temp;
        m_arr[i] = temp; }
    } else
    else {
    { m_arr[i] = j;
        m_arr[i] = j; m_arr[j] = temp;
        m_arr[j] = temp; }
    } }
}


 int Set::CollapsingFind( int i )
int Set::CollapsingFind( int i ) {
{ int r = i;
    int r = i; while( m_arr[r] >= 0 )
    while( m_arr[r] >= 0 ) r = m_arr[r];
        r = m_arr[r]; int s;
    int s; while( i != r )
    while( i != r ) {
    { s = m_arr[i];
        s = m_arr[i]; m_arr[i] = r;
        m_arr[i] = r; i = s;
        i = s; }
    } return r;
    return r; }
}
 
                    
                     
                    
                 
                    
                

 
     
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号