#include<iostream>
using namespace std;
//这大概是个老祖宗。
class UnionFind {
public:
virtual int size() = 0;
virtual bool isEmpty() = 0;
//是否连接(??啥)
virtual bool isConnected(int p, int q) = 0;
//联结元素(??啥)
virtual void unionElements(int p, int q) = 0;
};
//我们使用数组来实现并查集,这里我们忽略每个元素的数据,用每个元素的阶(阶是啥。。)(我回来了!,阶好像是数组的下标。。)表示元素本身,
//用数组中存的数字表示元素所属的集合。
//1、将每个元素初始化成自身,在下面的构造函数中实现。
//2、联合,将需要联合的元素中存储的数字统一为一个。
//3、查找,只要数组中存储的数字是一样的,那么认为两个元素属于同一个集合
//这大概是上一个老大哥的儿子
class QuickFind :public UnionFind {
public:
//儿子的构造函数(初始化)(这个操作我看懂啦)
QuickFind(int size)
{
m_data = new int[size];
for (int i = 0; i < size; ++i)
{
m_data[i] = i;
}
m_size = size;
}
//联合操作(参数要见名知意!!(气))(p和q是元素本身的值)(看懂啦~开森)
void unionElements(int p, int q)
{
if (p == q)
{
return;
}
for (int i = 0; i < m_size; i++)
{
if (m_data[i] == m_data[q])
{
m_data[i] = m_data[p];
}
}
}
//是否连接(是否在同一级???)
bool isConnected(int p, int q)
{
return find(p) == find(q);
}
int size()
{
return m_size;
}
bool isEmpty()
{
return m_size == 0;
}
void print()
{
cout << "QuickFind: " << "Size = " << m_size << endl;
cout << '[';
for (int i = 0; i < m_size; i++)
{
cout << m_data[i];
if (i != m_size - 1)
{
cout << ',';
}
}
cout << ']' << endl;
}
private:
//用来查找两个元素是否被联合在一起
int find(int index)//整明白了
{
if (index < 0 || index >= m_size)
{
cout << "访问越界!!" << endl;
throw 0;
}
return m_data[index];
}
int* m_data;
int m_size;
};
用数组实现的并查集算法
最新推荐文章于 2023-06-04 21:22:09 发布