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



