代码改变世界

我写的并查集[涂鸦]

2007-01-10 12:08  老博客哈  阅读(655)  评论(1编辑  收藏  举报
#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 
= new int[size];
    
if( m_arr == NULL )
        
throw std::bad_alloc("Allocation error in constructon!");
    
forint 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;
}