并查集

并查集:通过将相应的元素归类到相应的集合内,以便之后的查询

在这里,我们可以从一个集合内选出一个代表,来表示相应的集合


初始处理

初始时每个元素的所属集合仅有元素本身,所以其所属集合的代表元素也仅能为它本身

 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 }

 

posted @ 2021-11-19 15:35  yfmd  阅读(40)  评论(0编辑  收藏  举报