等价关系
关系R定义在集合S上。对于S中的a,b元素,如果aRb为true,那么就说ab有关系。 等价关系是满足下面三个条件的关系:
- 自反性aRa
- 对称性aRb当且仅当bRa
- 传递性若aRb,bRc则aRc。 例如≤不是等价关系,因为他不满足对称性; 导线连通则是一个等价关系。
动态等价行问题
给定一个等价关系~,考虑对于任意的a,b,是否有a~b?
一个元素的等价类是S的一个子集,它包含所有与a有(等价)关系的元素。 有了这个定义,我们只需要确定a,b是否在一个等价类中。 那么如何形成等价类?
- find,判断a,b的等价类名字是否相同
- union,检查a,b是否在一个等价类中,如果没有添加关系a~b
那么最直观的做法就是,把集合映射为一个int型数组,find(x)返回x的根,union(x,y)操作始终把x作为y的根。
class UF
{
private:
vector<int> s;
public:
int find(int x);
void union(int root1,int root2);
UF(int n):s(n, -1){};
};
int UF::find(int x) const{