并查集是通过找祖宗的方式,将分散的各个元素联系起来,形成一个个集合(组织)的一种数据结构或者说操作。
1.查找(寻找祖宗)
1 int Find(int x) 2 { 3 4 while(x!=father[x])//若祖宗值f[x]和自己x不同,说明另有其人 5 x=father[x];//直到找到祖宗根节点 6 return x; 7 }
2.合并(集中)。分散的各个点,通过给出两两的关系,进行合并。假设1和2是同类,那么指定一个方向(祖宗,假如以右边的为祖宗)。
1 void merge(int a,int b) 2 { 3 int fa=Find(a);//寻找a的祖宗 4 int fb=Find(b);//寻找b的祖宗 5 if(fa!=fb)//如果a和b的祖宗不同 6 { 7 father[fa]=fb;//a成为b的部下(即a的祖宗从自己变成了b(的祖宗)) 8 } 9 }
3.通过遍历父亲节点,找到f[x]==x的个数,即为集合的个数。(每个集合有唯一的祖宗)
题目: