并查集的不同写法

简介: 并查集的不同写法
#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;  
}  
目录
相关文章
|
1月前
|
算法
LeetCode[题解] 1261. 在受污染的二叉树中查找元素
LeetCode[题解] 1261. 在受污染的二叉树中查找元素
19 1
|
13天前
for循环嵌套for循环与递归的区别
for循环嵌套for循环与递归的区别
|
1月前
|
C语言
【汇编语言实战】使用插入排序对给定的数组排序(用栈传递参数)
【汇编语言实战】使用插入排序对给定的数组排序(用栈传递参数)
11 1
|
11月前
全排列的两种写法 2021-02-17
全排列的两种写法 2021-02-17
递归实现组合型枚举
递归实现组合型枚举
34 0
|
算法 C语言 C++
[c语言]二叉树 非递归算法(先中后遍历)
1.定义头文件加结构体变量 2.创建一棵树 3.初始化栈 4.头插法入栈 5.判断栈是否为空 6.出栈操作 7.先序遍历 8.中序遍历 9.后序遍历 10.主函数调用 11.运行结果:
130 1
|
搜索推荐
数据结构208-冒泡排序算法第二种写法
数据结构208-冒泡排序算法第二种写法
69 0
数据结构208-冒泡排序算法第二种写法
递归实现的三种枚举
递归实现的三种枚举
35 0