对于并查集转载一篇非常生动的博客【算法与数据结构】—— 并查集_the_ZED的博客-CSDN博客
并查集的两个操作:
1.将两个集合合并
2.询问两个元素是否在一个集合中
基本原理:
每一个集合用一棵树来表示,树根的编号就是整个集合的编号。对于每一个节点都存储一下它的父节点是谁,p[x]表示x的父节点。求某一个元素属于哪一个集合时,先找到它的父节点,如果它的父节点不是树根,就继续往上找,直到找到树根为止。最后当前的元素所属的树根编号就是所属集合的编号
三个问题:
1.如何判断树根:if(p[x]==x)
2.如何求x的集合编号:while(p[x]!=x) x=p[x];
3.如何合并两个集合:p[x]是x的编号,p[y]是y的编号。p[x]=y
优化:
路径压缩