并查集的定义:“并”,Union(合并);“查”,Find(查找);“集”,Set(查找);
- 并查集的实现:
int father[N]; //使用一个数组记录 father[1]=1; //1的父节点是本身 father[2]=1; //2的父节点是1
- 并查集的初始化:
for(int i=1;i<=n;i++){ father[i]=i; }
- 并查集的查找:
int findFather(int x){ while(x!=father[x]){ x=father[x]; } return x; }
- 并查集的合并:
void Union(int a,int b){ int faA=findFather(a); int faB=findFather(b); if(faA!=faB){ father[faA]=faB; } }
- 并查集的路径压缩:
int findFather(int a){ //由于x在下面的while中会变成根结点,所以先把x保存一下 int x=a; while(x!=father[x]){ x=father[x]; } //到这里,x存放的是根结点,下面吧路径上的所有结点的father都改为根结点 while(a!=father[a]){ int z=a; //这里a要被father[a]覆盖,所以先保存一下a的值 a=father[a]; //回溯a的父节点 father[z]=x; //把原先a的父节点改为根结点z } return x; //返回根节点 }