并查集(Disjoint-Set或Union-Find Set)是一种表示不相交集合的数据结构,用于处理不相交集合的合并与查询问题。在不相交集合中,每个集合通过代表来区分,代表是集合中的某个成员,能够起到唯一标识该集合的作用。一般来说,选择哪一个元素作为代表是无关紧要的,关键是在进行查找操作时,得到的答案是一致的(通常把并查集数据结构构造成树形结构,根节点即为代表)。 在不相交集合上,需要经常进行如下操作:
·findSet(x):查找元素 x 属于哪个集合,如果 x 属于某一集合,则返回该集合的代表。
·unionSet(x,y):如果元素 x 和元素 y 分别属于不同的集合,则将两个集合合并,否则不做操作。
并查集的实现方法是使用有根树来表示集合——树中的每个结点都表示集合的一个元素,每棵树表示一个集合,每棵树的根结点作为该集合的代表。
并查集基础操作:初始化
现共有N个元素,对这N个元素要进行查询与合并操作,现进行初始化;例如N = 10,初始化方法如下,father为i的父结点编号,初始化时结点的父结点为本身,即自己代表自己,建立N个独立集合:
[code]void MakeSet(int n) { for (int i = 1; i