我写的并查集[涂鸦]
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!");
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;
}
#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!");
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;
}