首页 > 编程语言 >【并查集】浅谈思想 & 代码实现 & 实战例题(C/C++)

【并查集】浅谈思想 & 代码实现 & 实战例题(C/C++)

时间:2024-07-05 21:29:26浏览次数:17  
标签:ifo 浅谈 int 查集 fa 集合 例题 节点 rk

思想综述

并查集(Union-Find)算法的主要操作包括两种:

  1. 合并(Union):将两个不相交的集合合并成一个集合。
  2. 查询(Find):查询两个元素是否属于同一个集合。

并查集算法的核心思想是使用树(通常是森林)来表示这些不相交的集合,其中每个集合被表示为一棵树,树的根节点代表这个集合的标识(或称为代表元素)。通常,我们会选择树的根节点作为该集合的代表元素,因为这样可以很方便地通过比较两个元素的根节点来判断它们是否属于同一个集合。

自定义结构体

typedef struct node{
	int fa, rk;
}Node;

算法实现要点

  1. 初始化:开始时,每个元素各自构成一个单元素的集合,即每棵树的根节点就是它唯一的节点。

    Node ifo[sz];//ifo数组记录每个结点的直接父亲
    void initialize(int num)//num为已知的节点总数,即要初始化的ifo结点个数
    {
    	for(int i=1; i<=num; i++)
    	{
    		ifo[i].fa = i;//i结点的初始直接父亲设为自己
    		ifo[i].rk = 0;//以i结点为根的树的初始高度为0
    	}
    }
  2. 查找祖先(Find_fa):为了找到某个元素的根节点(即它所在集合的代表元素),我们可以从该元素开始,沿着父节点的链接一直向上遍历,直到到达根节点。为了提高效率,常用的技巧是路径压缩(Path Compression),即在查找过程中,直接将每个节点链接到根节点上,这样下次查找时就可以直接到达根节点,从而减少查找时间。

    int find_fa(int a)#利用递归思想一路查找上去,直到找到根节点
    {
    	if(ifo[a].fa == a) return ifo[a].fa;//根节点特点:直接父亲是自己
    	return find_fa(ifo[a].fa);//返回根节点序号
    }
    

  3. 合并(Union):合并两个集合时,首先需要找到这两个集合各自的根节点。然后,将其中一个根节点的父节点设置为另一个根节点,从而将两个集合合并为一个集合。为了保持树的平衡,有时会选择较小(或较浅)的树作为另一棵树的子树,这可以通过比较两个根节点的秩(rank,即树的高度)来实现。不过,在许多应用中,直接合并而不考虑秩也是可行的,因为并查集的主要目的是快速判断元素是否属于同一集合,而不是维护树的具体形态。

    void Union(int a, int b)
    {
    	int fa_a = find_fa(a);
    	ifo[a].fa = fa_a;//"压缩路径",直接将每个节点链接到根节点上
    	int fa_b = find_fa(b);
    	ifo[b].fa = fa_b;//"压缩路径",直接将每个节点链接到根节点上
    	if(ifo[fa_a].rk < ifo[fa_b].rk)
    	{
    		ifo[fa_a].fa = fa_b;
    	}
    	else{
    		ifo[fa_b].fa = fa_a;
    		if(ifo[fa_a].rk == ifo[fa_b].rk) ifo[fa_a].rk++;
    	}
    }
    

实战例题

【PTA】7-4 朋友圈(C++ * 并查集思想)代码实现 & 一点反思_朋友圈pta-CSDN博客

~ 希望对你有帮助 ~

标签:ifo,浅谈,int,查集,fa,集合,例题,节点,rk
From: https://blog.csdn.net/H13420972436/article/details/140123064

相关文章

  • 浅谈一下Mybatis当中插入主键返回的两个属性(useGeneratedKeys,selectKey)
    useGeneratedKeys和selectKey的区别今天遇见两个Mybatis当中很有像似点的属性,仔细研究了会.发现还是有带你不同.useGenerateKeys其值为true和false,表明是否将插入生成的主键返回到参数当中.useGeneratedKey属性会自动根据驱动生成对应SQL语句useGeneratedKey只支持“......
  • 受不了了,浅谈维护括号序列最长全不匹配段的最长长度的两种方法
    首先我们亲爱的zyr同学在2道几乎一样的括号序列题上面用了2种不同的方式来维护pushup,而这和每道题题解的趋势几乎一致。但是我直接交的他的代码。所以写一下zyr队爷的思路。以下直接设(为\(1\),)为\(-1\)。一、结论法答案为右最大前缀和-左最小后缀和。(跨越......
  • 【C语言】指针经典例题
    题1: #include<stdio.h>intmain(){inta[5]={1,2,3,4,5};int*ptr=(int*)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));return0;}//程序的结果是什么?解答如下:  题2:#include<stdio.h>//这里告知结构体的大小是20个字节stru......
  • 浅谈前置处理器之取样器超时
    浅谈前置处理器之取样器超时取样器取样器超时设置决定了JMeter等待取样器完成并接收响应的最大时间长度。如果在这个时间内未收到响应,取样器将标记该请求为超时错误。参数说明●在取样器超时的配置界面找到“Sampletimeout(inmilliseconds)进行设置。●超时值以毫秒......
  • 浅谈前置处理器之用户参数
    浅谈前置处理器之用户参数“用户参数”前置处理器是一个非常实用的功能,它可以在每个请求执行前动态地为HTTP请求等添加或替换变量值。本文档将详细介绍“用户参数”前置处理器的使用方法、特点以及与用户定义变量的区别。用户参数前置处理器简介用户参数前置处理器允许你......
  • 浅谈逻辑控制器之模块控制器
    浅谈逻辑控制器之模块控制器模块控制器(ModuleController)是一种高级逻辑控制器,它提供了一个强大的机制来复用和组织测试计划中的组件。本文档将深入介绍模块控制器的功能、配置方法及其应用场景。功能概述模块控制器允许用户在测试计划中引用另一个测试片段(通常是一个简......
  • 万字长文浅谈系统稳定性建设
    1.背景京东的期中考试:618即将到来,各个团队都在进行期中考试前的模拟考试:军演压测,故障演练,系统的梳理以检测系统的稳定性以应对高可用,高性能,高并发。我们知道系统的稳定性建设是贯穿整个研发流程:需求阶段,研发阶段,测试阶段,上线阶段,运维阶段;整个流程中的所有参与人员:产品,研发,测试,......
  • 浅谈 K8s Service 网络机制
    浅谈K8sService网络机制云原生运维圈 2024-07-0112:03 上海 1人听过 以下文章来源于腾讯云原生 ,作者王成腾讯云原生.云原生技术交流阵地,汇聚云原生最新技术资讯、文章、活动,以及云原生产品及用户最佳实践内容。王成,腾讯云研发工程师,Kubernetesmember,从......
  • 贪心经典例题:均分纸牌
    希望粉丝破50. 贪心实际上就是把眼前的利益最大化,如果你要做出这道题你一定要找出贪心原则。贪心原则https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E8%B4%AA%E5%BF%83%E5%8E%9F%E5%88%99&fenlei=256&rsv_pq=0xb087efe300ab5a2d&rsv_t=78216%2Bh......
  • 浅谈 Selenium 控制浏览器操作
    控制浏览器操作:(1)最大化、最小化浏览器:driver.maximize_window()(2)控制、获取浏览器大小:driver.get_window_size()(3)获取当前标签页title、url:print("标签页title:{}".format(driver.title))print("标签页url:{}".format(driver.current_url))(4)前进、后退、刷新:#前进driver......