并查集
并查集:通过将相应的元素归类到相应的集合内,以便之后的查询
在这里,我们可以从一个集合内选出一个代表,来表示相应的集合
初始处理
初始时每个元素的所属集合仅有元素本身,所以其所属集合的代表元素也仅能为它本身
1 int father[N];
2 for(int i=1;i<=n;++i)father[i]=i;
合并操作
合并两个集合,只要将集合的代表元素找出来,连接就可以了
1 void merge(int x,int y) 2 { 3 int fx=find(x),fy=find(y); 4 father[fx]=fy; 5 }
查询操作
1 //递归查 2 int find(int x) 3 { 4 if(father[x]==x)return father[x]; 5 return find(father[x]); 6 }//注意可能会RE 7 //非递归查 8 int find(int x) 9 { 10 int root=x; 11 while(root!=father[root])root=father[root]; 12 return root; 13 } 14 //优化 15 //路径压缩 优点:高效 缺点:两个元素的直接关系会损失 16 //递归 17 int find(int x) 18 { 19 if(x==father[x])return x; 20 else return father[x]=find(father[x]); 21 } 22 //非递归 23 int find(int x) 24 { 25 while(x!=father[x])x=father[x]=father[father[x]]; 26 return x; 27 }