首页 > 其他分享 >并查集的操作

并查集的操作

时间:2023-05-02 23:12:30浏览次数:31  
标签:结点 return int root 查集 操作 Root1 Root2

//并查集

#include <stdio.h>
#define SIZE 100
int UFSets[SIZE];

void initial(int S[])//初始化并查集 全部设为-1 即每一个元素都是独立的
{
    for(int i=0;i<SIZE;i++)
    {
        S[i]=-1;
    }
}

int Find(int S[],int x)//查找元素操作 返回x所属根节点 x指的是数组下标
{
    while(S[x]>=0)//父节点如果大于等于0说明不是根节点 继续向上查询 如果小于0则说明是根节点 返回x
    {
        x=S[x];
    }
    return x;
}

void Union(int S[],int Root1,int Root2)//并操作 Root1和Root2指的是数组下标
{
    if(Root1==Root2)//如果两个集合是相同的 不可以执行并操作
    {
        return;
    }
    else
    {
        S[Root2]=Root1;//否则 将Root2的父节点设为Root1
    }
}

void BetterUnion(int S[],int Root1,int Root2)//并的优化
{
    if(Root1==Root2)
    {
        return;
    }
    if(S[Root2]>S[Root1])//用绝对值来存储树的结点个数 如-7代表该根结点下有7个结点(包括根结点)
    {
        S[Root1]+=S[Root2];//因为是负数 所以如果S[Root2]>S[Root1] 说明Root2下的结点要少于Root1 将两个树的结点个数相加
        S[Root2]=Root1;//将Root2的根结点指向Root1
    }
    else
    {
        S[Root2]+=S[Root1];
        S[Root1]=Root2;
    }
}

int BetterFind(int S[],int x)//Find算法优化 压缩路径    
{
    int root = x;
    while(S[root]>=0)//找出x结点的根结点并将其赋给root
    {
        root = S[root];
    }
    while(x!=root)//如果x不是根节点的话 就将其直接接到根结点上
    {
        int t=S[x];//先把x原来的位置保存下来
        S[x]=root;//将结点接到根结点上的操作
        x=t;//向上查找父节点 并将其全部接到跟结点上
    }
    return root;
}

int main()
{
    return 0;
}

 

标签:结点,return,int,root,查集,操作,Root1,Root2
From: https://www.cnblogs.com/ryuichi-ssk/p/17368497.html

相关文章

  • java操作Set集合
    java操作Set集合 importjava.util.HashSet;importjava.util.Set;publicclassSetExample{publicstaticvoidmain(String[]args){//创建一个HashSet对象Set<String>set=newHashSet<>();//添加元素......
  • 带权并查集
    做了cf上一道题后发现我对并查集的理解不够深刻,顺带把带权并查集学一下。并查集初始化:对于一个集合A的所有元素,我们知道对于其中任意一个元素i,i€A。此时,我们可以认为i与A之间存在一条虚边,如果有新的元素要加入集合A,将该元素与A建一条边即可。这条边我们用数组fa[i]......
  • 【pytorch】为什么 ToTensor 后紧接 Normalize 操作?
    学习pytorch的transforms一节中产生疑问:ToTensor操作中图像数据满足[0,255]条件会进行线性归一化,映射到[0,1]。在ToTensor操作后一般紧接着Nomalize操作,又进行了一次标准差归一化。既然已经归一化了一次,为什么还要再来一次?以下是我在网络上找到的一些答案:数据如果......
  • LeetCode 链表操作
    21. 合并两个有序链表/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,ListNodenext){this.val=val;this.......
  • NC20279 [SCOI2010]序列操作
    题目链接题目题目描述lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作:0ab把[a,b]区间内的所有数全变成01ab把[a,b]区间内的所有数全变成12ab把[a,b]区间内的所有数全部取反,也就是说把所有的0变成1,......
  • python excel 操作
    7个库:xlrd库:从excel中读取数据,支持xls、xlsxxlwt库:对excel进行修改操作,不支持对xlsx格式的修改xlutils库:在xlw和xlrd中,对一个已存在的文件进行修改openpyxl:不支持xls,只支持.xlsx、.xlsm、.xltx、.xltm。可以通过TotalExcelConverter软件进行excel格式转换。软件下载连接:TotalE......
  • 加算操作
    【2022重庆市中考A卷数学选择压轴题】加算操作题目背景2022重庆市中考A卷数学选择压轴题。题目描述现定义加算操作为对于长度为$n$的只含减法运算的序列$a_1-a_2-\cdots-a_{n-1}-a_n$,可以随意在其中两项加入一对括号,比如,对于$a_1-a_2-a_3-a_4-a_5$,可以进行加算操作变成......
  • 21 文件六大基本操作
    文件的六大基本操作:新建、打开、关闭、读写、删除文件;辅助操作:操作根目录文件:操作文件,先要找到与该文件对应的rfsdir_t结构;get_rootdirfile_blk函数:获取根目录文件,先调用get_rootdir函数获取根目录的rfsdir_t结构,到一个缓冲区中;del_rootdir函数释放缓冲区;获取文件名:......
  • Halcon XLD 轮廓操作,轮廓交集补集
    8.1获取轨迹的图像数据 获取轮廓坐标get_contour_xld     算子:get_contour_xld(Contour ::: Row, Col)示例:get_contour_xld(Contours4,Row26,Col)Contours4(输入对象):输入轮廓对象Row26(输出控制参数1):输出轮廓的每一个点的行坐标Col(输出控制参数2):输出轮廓的每一个点的......
  • Halcon XLD 轮廓操作,轮廓交集补集
     8.1获取轨迹的图像数据 获取轮廓坐标get_contour_xld     算子:get_contour_xld(Contour ::: Row, Col)示例:get_contour_xld(Contours4,Row26,Col)Contours4(输入对象):输入轮廓对象Row26(输出控制参数1):输出轮廓的每一个点的行坐标Col(输出控制参数2):输出轮廓的......