ACM入门(1)——数据结构——并查集

ACM_种类并查集 简介种类并查集: 和基础并查集有很大一部分相同, 多了一个判断2个元素是否属于同一个集团(不是集合, 集合是用来判断2个元素是否能够判断他们属不属于同一个集团:有点绕, 举个例子, 假如知道1和2在不同的集团, 3和4在不同集团,我们就不能判断1和3是否属于一个集团,而集团是用来判断他们是否在同一个集团假如:已知1和2在不同集团,2和3在不同集团, 那么我们就知道1和3在同一个集团);要懂 阅读详情

ACM入门(1)——数据结构——并查集
                                                                并查集
一、检索某元素属于哪个集合(find()函数)
二、合并两个集合(union()函数)  
能够查找某个元素属于哪个集合(即“查”),同时能够实现集合的合并(即“并”),这样的数据结构,我们称之为并查集。

并查集的实现:(C/C++)
#define max_size 元素个数
int parent[max_size];//用memset(parent,-1,sizeof(parent));初始化
int find(int x)
{
if(parent[x]>0)
  parent[x]=find(parent[x]);//递归查找,同时起到了压缩路径的作用
return parent[x]>0? parent[x]:x;//返回父亲节点,根节点返回自身
}
void union_set(int x,int y)
{
x=find(x),y=find(y);//查找父亲节点
if(x!=y)//合并时不能是相同父亲节点的
{
  if(parent[x]<parent[y])//比较大小,小的连到大的上
  {
    parent[x]+=parent[y];
    parent[y]=x;
  }
   else
  {
    parent[y]+=parent[x];
     parent[x]=y;
   }
}
}
举个例子:
Hdu1856
                                                    More is better
Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 327680/102400 K (Java/Others)
Total Submission(s): 803    Accepted Submission(s): 290

Problem Description
Mr Wang wants some boys to help him with a project. Because the project is rather complex, the more boys come, the better it will be. Of course there are certain requirements.
Mr Wang selected a room big enough to hold the boys. The boy who are not been chosen has to leave the room immediately. There are 10000000 boys in the room numbered from 1 to 10000000 at the very beginning. After Mr Wang's selection any two of them who are still in this room should be friends (direct or indirect), or there is only one boy left. Given all the direct friend-pairs, you should decide the best way.

Input
The first line of the input contains an integer n (0 ≤ n ≤ 100 000) - the number of direct friend-pairs. The following n lines each contains a pair of numbers A and B separated by a single space that suggests A and B are direct friends. (A ≠ B, 1 ≤ A, B ≤ 10000000)

Output
The output in one line contains exactly one integer equals to the maximum number of boys Mr Wang may keep.
Sample Input
41 23 45 61 641 23 45 67 8

Sample Output
4
2

Hint
A and B are friends(direct or indirect), B and C are friends(direct or indirect), then A and C are also friends(indirect). In the first sample {1,2,5,6} is the result. In the second sample {1,2},{3,4},{5,6},{7,8} are four kinds of answers.
代码如下:(c++)
#include<iostream>
using namespace std;
int parent[10000001],mymax;
int find(int x)
{
       if(parent[x]>0)
              parent[x]=find(parent[x]);//根节点以负数表示,同时绝对值表示集合元素个数
       return parent[x]>0? parent[x]:x;
}
void union_set(int x,int y)
{
       x=find(x),y=find(y);
       if(x!=y)
       {
              if(parent[x]<parent[y])//注意根节点均为负的
              {
                     parent[x]+=parent[y];
                     mymax=mymax<parent[x]? mymax:parent[x];
                     parent[y]=x;
              }
              else
              {
                     parent[y]+=parent[x];
                     mymax=mymax<parent[y]? mymax:parent[y];
                     parent[x]=y;
              }
       }
}
int main()
{
       int n;
       while(cin>>n)
       {
              if(n==0)
              {
                     cout<<"1"<<endl;
                     continue;
              }
              memset(parent,-1,sizeof(parent));//数组初始化为-1;
              mymax=0;
              int i,a,b;
              for(i=0;i<n;i++)
              {
                     cin>>a>>b;
                     union_set(a,b);
              }
              cout<<-mymax<<endl;//最大集合根节点值的相反数即为所求
       }
       return 0;
}

数据结构-并查集 数据结构-并查集 何为并查集 简述 并查集(Union Find)是一种用于管理分组的数据结构。它具备两个操作:(1)查询元素a和元素b是否为同一组   (2) 将元素a和b合并为同一组。 在一些应用问题中,我们常需把n个不同的元素划分成若干组不相交的集合,开始时各个元素自成单元素集合,然后按照一定条件将归于同一类的元素的集合合并,在此过程中需反复查询元素归属于哪个集合。 并... 阅读详情

相关推荐

ACM菜鸟入门培训1

ACM 第一讲 自我介绍: 讲师,6、7年前曾经是ACM的培训老师,算重操旧业。13066628662,信息楼434。以前讲C语言和数据结构通常不带教材和讲义,现在退化很多,不要对其有太高期待。 ACM比赛: 一支队伍3位ACMer ACM特点:绝对的专业性,绝对的公平,绝对的正能量。 培训目标:以ACM为中心,提高专业素质,补充正能量。 (计划每周一次,本学期讲三到四次,三、四个主题。不是相关...

largebird740610的博客 1185

优快云-markdown编辑器 语法模板(自用)

优快云-markdown编辑器 语法模板(自用) 备忘以供查询 @[TOC](这里写自定义目录标题) # 欢迎使用Markdown编辑器 你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 ## 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 1. **全新的界面

a864636467的博客 518

Nginx反向代理MinIO私有桶签名失效?一招解决Host头校验问题

本文详细解析了Nginx反向代理MinIO私有桶时出现的签名失效问题,重点解决了Host头校验导致的"SignatureDoesNotMatch"错误。通过精准配置proxy_set_header保持Host头一致性,并提供了二级目录代理和调试指南,帮助开发者高效解决这一常见技术难题。

weixin_29201313的博客 321

《并查集》hdu acm 5.1.7 c++ map的使用

#include #include #include using namespace std; mapstring,int> m; const int maxn=200005; int f[maxn],num[maxn],cnt; char name[maxn][15]; void init() { int i; for(i=1;imaxn;i++) { f[i]=i; num[

a709743744的博客 287

RAGFlow核心引擎DeepDoc之PDF解析大起底

本文深入解析RAGFlow中的deepdoc模块,重点介绍了pdf文档解析器的实现细节。deepdoc包含parser(文档解析器)和vision(视觉处理)两大核心功能,其中pdf解析是最复杂的部分。文章详细剖析了PdfParser类的设计架构,包含PlainParser(基础文本提取)、RAGFlowPdfParser(核心处理流水线)和VisionParser(视觉扩展)三个类,它们通过统一的__call__方法返回标准化结果。还具体讲解了初始化过程如何加载OCR引擎、布局识别模型、表格结构识别器等关

yxkong的专栏 2024

告别混乱代码!在Arduino IDE中管理多文件项目的5个必备技巧

本文分享了在Arduino IDE中管理多文件项目的5个必备技巧,帮助开发者告别混乱代码。通过代码分割和模块化设计,提升编译效率、降低内存占用,并实现功能解耦。重点介绍了头文件设计、CPP文件实现、调试技巧和工业级目录结构,让你的Arduino项目像乐高积木一样清晰易维护。

fun88的博客 361

并查集

并查集(union-findsets)是一种数据结构,其主要用于处理一些不相交集合的合并问题。**一些常见的应用场景,求连通子图,求最小生成数算法和求最近公共祖先(LCA)**等

weixin_43452554的博客 185

基于FFT的阵列方向图快速计算公式推导

因为自己毕设涉及到阵列方向图综合相关知识,最近阅读了关于方向图综合的相关文献,就其中关于使用FFT计算阵列方向图的方法进行了公式推导。 简介: 自从1965年Colley-Tukey发表快速傅里叶变换[1]论文以来,FFT在许多科学技术领域获得了广泛和成功的应用。在阵列信号处理与雷达信号处理领域,随着科技的发展,对于电尺寸较大的相控阵天线,使用公式按照级数求和计算天线阵列方向图的方法效率甚低,...

qq_38151438的博客 4290

ACM并查集(两种最最基本的模板,C++)(附最小生成树的Kuskal解法)

有关并查集的详细介绍 第一种写法可以看作: 连通分支数-1 第二种写法可以看作: n-1-边的数量(n-1是n个点构成连通图的最小边数) 比较详细也比较初级的写法一: #include <bits/stdc++.h> using namespace std; int pre[1030]; bool t[1030]; int root(int x){ int r=x,i=x; while(pre[r]!=r)//找到老大 r=pre[r]; whi

书伯的博客 297

Kafka延迟队列实现方案全解析

$ \text{时间轮} = \text{环形数组} + \text{分层设计} $$需要补充代码实例或特定场景的优化方案可进一步细化,此大纲已覆盖核心技术路径。

lz989796的博客 817

无网环境也能玩转DBeaver?手把手教你离线安装与ClickHouse连接(附实测jar包)

本文详细介绍了在无网环境下如何离线安装DBeaver并配置ClickHouse连接的完整指南。通过准备必备工具如DBeaver安装包、ClickHouse JDBC驱动及Maven本地仓库,确保在物理隔离环境中实现数据库管理。文章包含详细的安装步骤、驱动配置和性能优化建议,帮助开发者在严格网络限制下高效工作。

weixin_42635064的博客 375

ACM并查集浅谈

并查集,顾名思义,就是查找集合然后合并。主要思想就是通过find-union函数实现的,所有的元素都用一个数组表示。如果两个元素属于一个集合,就用find函数将两个元素划分到一个集合中。 在ACM常见题中,主要分为两种情况: 1.集合数量未知。 2.集合数量已知。 对于几何数量未知的情况,

kyriesnow的专栏 709

注册“Oracle Provider for OLE DB”和创建链接服务器

注册“Oracle Provider for OLE DB”和创建链接服务器 在sql server 数据库上创建链接服务器,连接oracle数据库,访问接口需要设置为:“Oracle Provider for OLE DB”。 如果电脑上没有这个驱动,安装一个完整的Oracle11gR2程序是一个有效的方法,但这个64位版本的安装包有2个多G, 相当庞大,如果仅仅...

weixin_30760895的博客 2384

ACM入门攻略(紫书入门,不间断更新)

前言:本文最初写于博主大一,目前是2020疫情状态,一路走来,博主从大一上接触ACM到现在,多多少少有了一些感悟。现在博主已经把紫书前11章看完,vj刷到500多道题,希望可以写一些东西可以帮助像当初博主一样的初学者完成入门阶段的算法学习。 声明:本文仅供参考,并且假定读者已经可以熟练运用C语言及其相关知识(大神请走开,谢谢配合)。 目录:一.ACM入门的相关准备(书籍,OJ,编程语言,常用网...

Alanrookie的博客 1万+

AWS 小白书 [1] 全球架构

小白应该知道的 AWS 知识

boshansolo的博客 704

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数据结构-并查集专题(1)

并查集(disjoint set),英文直译过来是不相交的集合。我们中文取名成并查集,是因为这类集合主要具有两个操作:并和查,并即合并两个集合,查即查询集合的某些信息。

Beau_Will的博客 1411

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ACM数据结构专题

ACM数据结构专题A题思路代码&解释总结B题思路代码&解释总结 A题 思路 其实是一道括号匹配题,可以使用数据结构的栈。 如果是’(’,入栈。 如果是’)’,栈非空则出栈。栈空则累加多余括号。 最后加上栈中剩余元素和。 代码&解释 int t,n,i; int main() { scanf("%d",&t); while(t--){ i...

CH3UHX9 531

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ACM——并查集

目录并查集概述1、POJ 1988 Cube Stacking 并查集概述 并查集是一种树型的数据结构,用于处理不相交集合的合并及查询问题。 并查集主要分为两种操作:查找和合并。 (1)查找元素的祖先,为降低复杂度,首先进行路径压缩,即找到最久远的祖先时“顺便"把它的子孙直接连接到他的孩子处,这样就避免了树的结构退化,提高效率。 int getFather(int u){ if(father[u]...

锵锵锵锵蒋的博客 674

ACM入门之【并查集】

并查集是一种树形的数据结构,顾名思义,它用于处理一些不交集的 合并 及 查询 问题。 它支持两种操作: 查找:确定某个元素处于哪个子集. 合并:将两个子集合并成一个集合。 基本模板: const int N=1e5+10; int p[N]; int find(int x) { if(x!=p[x]) p[x]=find(p[x]); return p[x]; } 并查集分为: 常见的一般的并查集 带权并查集 基础习题: 836. 合并集合 837. 连通块中点的数量 ...

辉小歌的博客 842

ACM:并查集

并查集

2402_86265887的博客 453

ACM:并查集专题

并查集专题

2402_86265887的博客 519

ACM入门之新手入门

第一章 新手入门1.ACM国际大学生程序设计竞赛简介1)背景与历史1970年在美国TexasA&M大学举办了首次区域竞赛,从而拉开了国际大学生程序设计竞赛的序幕。1977年,该项竞赛被分为两个级别:区域赛和总决赛,这便是现代ACM竞赛的开始。在亚洲、美国、欧洲、太平洋地区均设有区域赛点。1995至1996年,来自世界各地的一千多支s代表队参加了ACM区域竞赛。ACM大学生程序设计竞赛由

hncqp的专栏 1万+

9.6.1 ACM-ICPC 数据结构 并查集

合并(Union)和查找(Find)。它在解决连通性问题、图论问题(如最小生成树的 Kruskal 算法)以及其他需要动态连通性维护的场景中有着广泛应用。并查集的核心思想是通过树结构表示集合中的元素,并通过路径压缩和按秩合并等优化手段提升操作效率。本文将介绍并查集的基本概念、操作及优化方法,并结合实际例子进行说明。并查集作为一种经典的数据结构,在解决图论和集合操作问题中有着不可替代的作用。通过路径压缩和按秩合并优化后的并查集,其时间复杂度接近于常数时间,能够高效地处理大量动态操作。

tang7mj的博客 1377

谈一下ACM的入门书籍及方法

首先说一下,ACM的入门方法多种多样,大部分人还是跟着学校一起参加集训,所以我这里主要是想对那些准备ACM入门的业余的朋友谈的。 入门书籍: 首先推荐一些ACM的书籍:(以下我都会给出在当当网的页面,方便大家直接购买,以下排名不分先后) 1.《程序设计导引及在线实践》http://product.dangdang.com/product.aspx?product_id=20051430&...

weixin_30319153的博客 234

ACM模板——并查集

#define _for(i,a,b) for(int i = (a);i < (b);i ++) const int maxn = 50003; int par[maxn]; //父亲 int high[maxn]; //树的高度 void init(int n) { _for(i,0,n) { par[i] = i; ...

weixin_30535913的博客 202
上一篇: ACM入门(2)——数据结构——堆排序
下一篇: ACM入门(3)——图的遍历——广度优先搜索
clbxp
博客等级 码龄21年 35粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值