我写的并查集[涂鸦]

#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;
}

posted @ 2007-01-10 12:08 农夫三拳 阅读(319) 评论(1)  编辑 收藏 所属分类: Algorithm

  回复  引用    
#1楼 2007-01-10 22:21 | drizzlecrj [未注册用户]
感觉还是把Union直接给傻瓜话比较好,这样就方便许多了

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: