并查集的不同写法

简介: 并查集的不同写法
#define MAX_SIZE 100005  
int pa[MAX_SIZE];        //存储有向图的边
 
void init()     //初始化 该函数可以根据具体情况保存和初始化需要的内容  
{  
  for(int i = 0; i < MAX_SIZE; i++)  
  {  
    pa[i] = i;  
  } 
}  
 
int find(int a) //不带路劲压缩  
{  
  while(pa[a] != a)  
    a = pa[a];  
  return a;  
}  
 
void merge(int a, int b)      //集合合并  
{  
  int a1 = find(a);  
  int b1 = find(b);
  if(a1 != b1)    //这个判定条件可选,主要是为了防止find路径压缩的时候出现死循环
    pa[a1] = b1;    //如果存的是有向图,并且做题时集合中元素的顺序很重要,不能忽略,那么这里应该用"pa[a] = b;" 
} 

路经压缩

while写法

int find(int x)      //找元素所在集合的代表元(因为用了路径压缩,路径压缩的主要目的是为了尽快的确定元素所在的集合)  
{  
  int t1,t2=x;
  while(x!=p[x])  
    x=p[x];  
  while(t2!=p[t2])        //这里优化的思路还是路径压缩(进一步的在查找函数执行的过程中压缩路径)
  {  
    t1=p[t2];  
    p[t2]=x;  
    t2=t1;  
  }  
  return x;  
} 

递归写法

int find(int x)  
{  
  if(p[x] != x)  
  {         
    int root = find(p[x]);   
    return p[x] = root;  
  }  
  else  
    return x;  
}  
目录
打赏
0
1
2
0
1
分享
相关文章
代码随想录Day9 栈与队列 LeetCodeT20 有效的括号 T1047 删除字符串中所有相邻重复项 T150 逆波兰表达式求值
代码随想录Day9 栈与队列 LeetCodeT20 有效的括号 T1047 删除字符串中所有相邻重复项 T150 逆波兰表达式求值
40 0
数组嵌套数组去重
在JavaScript中对嵌套数组进行去重的方法,提供了一个具体的函数实现。
28 1
数组嵌套数组去重
|
5月前
数组去重for循环和for循环嵌套
数组去重for循环和for循环嵌套
48 0
|
9月前
for循环嵌套for循环与递归的区别
for循环嵌套for循环与递归的区别
【数据结构】归并排序的非递归写法和计数排序
【数据结构】归并排序的非递归写法和计数排序
|
10月前
|
【汇编语言实战】使用插入排序对给定的数组排序(用栈传递参数)
【汇编语言实战】使用插入排序对给定的数组排序(用栈传递参数)
77 1
全排列的两种写法 2021-02-17
全排列的两种写法 2021-02-17
斐波那契数列的几种写法 2021-02-23
斐波那契数列的几种写法 2021-02-23
【每日算法Day 108】一道简单的二叉树题目,写法还是挺多的。
【每日算法Day 108】一道简单的二叉树题目,写法还是挺多的。
leetcode-每日一题565. 数组嵌套(标记图和并查集)
这题告诉我们数组内的数字是0-N-1,且不会重复,我们可以把A[i] , A[A[i]]…看成一个环,数组可以被分成多个环,我们只需计算多个环中的最大长度即可
112 0
leetcode-每日一题565. 数组嵌套(标记图和并查集)
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等