并查集的学习

并查集可以理解为数学上的集合

并查集一般以树这种数据结构来储存每一个元素,判断两个元素是否为同一个集合,通常判断两个元素所在的树的根结点是否相同,因为比较两个元素是否是同一个树要向上查找根结点,所以一般用双亲表示法,储存在数组中

并查集的两种操作

1.查找某个元素所在的集合

并查集中集合一般以根结点表示所以查找集合等价于找根结点

//a数组表示集合,a[i]表示下标为i的元素的父结点所在的位置
int find(int x)
{if(a[x]==0)//根结点没有父亲,元素值为0return x;else{a[x]=find(a[x]);//压缩路径return a[x];
}

2.合并两个元素所在的集合

void bing(int left, int right)//传入要合并的两个元素
{int t1 = find(left);//找到根结点int t2 = find(right);//找到根结点if (t1 != t2)//如果两个元素不在同一个集合{s[t2] = t1;//将其中一个根结点的父结点指向另一个}return;
}

洛谷 P3367 【模板】并查集

题目描述

如题,现在有一个并查集,你需要完成合并和查询操作。

输入格式

第一行包含两个整数 N,M ,表示共有 N 个元素和 M 个操作。

接下来 M 行,每行包含三个整数 Zi​,Xi​,Yi​ 。

当 Zi​=1 时,将 Xi​ 与 Yi​ 所在的集合合并。

当 Zi​=2 时,输出 Xi​ 与 Yi​ 是否在同一集合内,是的输出 Y ;否则输出 N 。

输出格式

对于每一个 Zi​=2 的操作,都有一行输出,每行包含一个大写字母,为 Y 或者 N 。

输入输出样例

输入 #1

4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4

输出 #1

N
Y
N
Y

说明/提示

对于 30% 的数据,N≤10,M≤20。

对于70% 的数据,N≤100,M≤10^3。

对于 100% 的数据,1≤N≤10^4,1≤M≤2×10^5,1≤Xi​,Yi​≤N,Zi​∈{1,2}。

模板题,考察的就是并查集的两种操作

AC代码

#include<stdio.h>
int a[10001], n, m, flag;
int find(int x)//传入要查找的元素,返回其集合的根结点
{if (a[x] == 0)//根结点的父结点指向0,遇到0结束return x;else//若父结点不是根结点,让值本身等于其父亲,查找父亲的父结点是否为根结点{a[x] = find(a[x]);//压缩路径return a[x];}
}
void bing(int x, int y, int z)//
{int t1 = find(x);//找到x集合根结点int t2 = find(y);//找到y集合根结点if (t1 != t2)//两个元素不在同一个集合{if (z == 1)//z为1合并两个集合a[t2] = t1;if (z == 2)//z为2且两个元素不在同一个集合输出Nprintf("N\n");return;}else if (z == 2)//两个元素在同一个集合且z等于2输出Yprintf("Y\n");return;
}
int main()
{int x, y, z;scanf("%d %d", &n, &m);while (m--){scanf("%d %d %d", &z, &x, &y);bing(x, y, z);}return 0;
}

 

洛谷 P1111 修复公路

题目背景

A 地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车。政府派人修复这些公路。

题目描述

给出 A 地区的村庄数 N,和公路数 M,公路是双向的。并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路。问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路)。

输入格式

第 1 行两个正整数 N,M。

下面 M 行,每行 3 个正整数x,y,t,告诉你这条公路连着 x,y 两个村庄,在时间t时能修复完成这条公路。

输出格式

如果全部公路修复完毕仍然存在两个村庄无法通车,则输出 −1,否则输出最早什么时候任意两个村庄能够通车。

输入输出样例

输入 #1

4 4
1 2 6
1 3 4
1 4 5
4 2 3

输出 #1

5

说明/提示

1≤x,y≤N≤10^3,1≤M,t≤10^5。

 解题思路

本题也是考察并查集的两个操作,特殊的是如何判断修完后任意两个村庄是否通车和最短在什么时候任意两个点能通车,

第一点很好判断,在所有路修完后是否只有一个根结点,如果只有一个根结点即任意两点能通车

要满足第二点首先要根据修每条路的时间进行从小到大排序,之所以要排序是因为两个村庄如果第一次有连系就会优先更新最小时间。

特殊的两点思路已知,看代码

#include<stdio.h>
struct nm {//结构体储存修的每一条路的信息int le, ri;int tt;
}a[100010], b[100010], t;
void nm(int x, int y)//归并排序,更据修路时间从小到大排序不用多少
{if (x >= y) return;int mid = (x + y) / 2;nm(x, mid);nm(mid + 1, y);int k = 1;int i = x, j = mid + 1;while (i <= mid && j <= y){if (a[i].tt <= a[j].tt)b[k++] = a[i++];elseb[k++] = a[j++];}while (i <= mid)b[k++] = a[i++];while (j <= y)b[k++] = a[j++];for (i = 1; i < k; i++)a[x + i - 1] = b[i];
}
int s[1010], book[1010], flag;
int getf(int x)//查找x元素根结点
{if (s[x] == 0)return x;else{s[x] = getf(s[x]);//压缩路径return s[x];}
}
int bing(int left, int right)//返回1代表两个元素不在同一集合,返回0代表在同一集合
{//得到两个元素的根结点int t1 = getf(left);int t2 = getf(right);if (t1 != t2)//两个元素不在同一集合{s[t2] = t1;//合并return 1;}return 0;
}
int main()
{int n, m, i, t = 0;scanf("%d %d", &n, &m);int sum = n;//初始有n个集合for (i = 1; i <= m; i++)scanf("%d %d %d", &a[i].le, &a[i].ri, &a[i].tt);nm(1, m);//排序for (i = 1; i <= m; i++)//修m条路{int ss = bing(a[i].le, a[i].ri);//合并if (ss == 1)//如果ss为1代表两个村庄所在的集合第一次有连系{sum--;//两个集合合并,树的数量减少1t = a[i].tt;//更新时间}}if (sum == 1)//如果只有唯一集合即所有村庄都有联系printf("%d", t);else//存在两个村庄无法通车,输出 −1printf("-1");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/654503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sphinx的原理详解和使用

一、Sphinx介绍 1.1 简介 Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎。意图为其他应用提供高速、低空间占用、高结果 相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。当前系统内置MySQL和PostgreSQL 数据库数据源的支持&#xff0c;也…

限时回归!!!3D版《空洞骑士》!!!

空洞骑士是一款基于横板平台跳跃的传统风格2D动作冒险游戏。庞大的游戏世界交错相通&#xff0c;玩家控制小虫子去探索幽深黑暗的洞穴&#xff0c;成为了一代人茶余饭后的惦念&#xff0c;深受广大玩家们的喜爱。 这类平台跳跃游戏一般是游戏开发初学者以及独立游戏开发者们比…

【DRAM存储器十八】DDR3介绍

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考资料&#xff1a;《镁光DDR3数据手册》 、《JESD79-3E》 最近忙于工作&#xff0…

Linux使用匿名管道实现进程池得以高效通信

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;Nonsense—Sabrina Carpenter 0:50━━━━━━️&#x1f49f;──────── 2:43 &#x1f504; ◀️ ⏸ ▶️ …

python基础四------完结(概念在下面,代码看不懂了再看)

# a_list [1,2,3,4,5] # # print(a_list)# 根据下标来删除列表中的元素 # 爬取的数据中 有个别的数据 是我们不想要的 那么我们就可以通过下标的方式来删除 # del a_list[2] # print(a_list)# b_list [1,2,3,4,5] # print(b_list) # pop是删除列表中的最后一个元素 # b_list.…

stack Error: EACCES: permission denied

报错 stack Error: EACCES: permission denied解决 npm install webpack --save-dev --unsafe-perm参考 npm报错stack Error: EACCES: permission denied, mkdir

Kali 基本命令大全

一、系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件- (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpu…

蓝桥杯-岛屿个数-bfs-dfs算法

小蓝得到了一副大小为 M N 的格子地图&#xff0c;可以将其视作一个只包含字符‘0’&#xff08;代表海水&#xff09;和 ‘1’&#xff08;代表陆地&#xff09;的二维数组&#xff0c;地图之外可以视作全部是海水&#xff0c;每个岛屿由在上/下/左/右四个方向上相邻的 ‘1’…

AP5216 平均电流型LED降压恒流驱动IC 手电筒汽车摩托车灯芯片

产品描述 AP5216 是一款 PWM工作模式, 高效率、外围简单、内置功率管&#xff0c;适用于5V&#xff5e;100V输入的高精度降压 LED 恒流驱动芯片。输出最大功率可达9W&#xff0c;最大电流 1.0A。AP5216 可实现全亮/半亮功能切换&#xff0c;通过MODE 切换&#xff1a;全亮/半亮…

SAP HANA 报错信息,如何根据报错关键词去进行处理

HANA建模其实上手会比较快&#xff0c;基本会SQL就可以进行开发。 在实际开发中&#xff0c;难点一个是建模思路&#xff0c;另外一个则是建模中报错的处理。 现在将HANA中报错进行一个整理&#xff0c;这里的并不是完整的报错信息&#xff0c;大家可以根据关键词进行查看。 …

ChatGPT更新了Mention功能,集结若干GPTs作战,AI智能体的心智入口;向量数据库的挑战和未来

&#x1f989; AI新闻 &#x1f680; ChatGPT更新了Mention功能&#xff0c;集结若干GPTs作战&#xff0c;AI智能体的心智入口 摘要&#xff1a;OpenAI在ChatGPT中引入了一个新功能&#xff0c;允许用户在聊天时任意一个GPTs&#xff08;即ChatGPT最新推出的AI Agent 智能应用…

scrapy的入门使用

1 安装scrapy 命令: sudo apt-get install scrapy或者&#xff1a; pip/pip3 install scrapy2 scrapy项目开发流程 创建项目: scrapy startproject mySpider生成一个爬虫: scrapy genspider itcast itcast.cn提取数据:     根据网站结构在spider中实现数据采集相关内…

五、MySQL的备份及恢复

5.1 MySQL日志管理 在数据库保存数据时&#xff0c;有时候不可避免会出现数据丢失或者被破坏&#xff0c;这样情况下&#xff0c;我们必须保证数据的安全性和完整性&#xff0c;就需要使用日志来查看或者恢复数据了 数据库中数据丢失或被破坏可能原因&#xff1a; 误删除数据…

C/C++ - 函数进阶(C++)

目录 默认参数 函数重载 内联函数 函数模板 递归函数 回调函数 默认参数 定义 默认参数是在函数声明或定义中指定的具有默认值的函数参数。默认参数允许在调用函数时可以省略对应的参数&#xff0c;使用默认值进行替代。 使用 默认参数可以用于全局函数和成员函数。默认参…

C语言KR圣经笔记 5.12 复杂声明

5.12 复杂声明 C 语言有时会因为声明的语法而受到谴责&#xff0c;特别是涉及函数指针的声明语法。语法试图使声明和使用一致&#xff1b;在简单的情况下它的效果不错&#xff0c;但在更复杂的情况下会让人困惑&#xff0c;因为声明不能从左往右读&#xff0c;而且括号被过度使…

Linux文本三剑客---sed经典案例

Sed介绍&#xff1a; sed是一种流编辑器&#xff0c;它一次处理一行内容。处理时&#xff0c;把当前处理的行存储在临时缓冲区中&#xff0c;称为“模式空间”&#xff0c;接着用sed命令处理缓冲区中的内容&#xff0c;处理完成后&#xff0c;把缓冲区的内容送往屏幕。接着处理…

Mybatis-plus原生pages分页未生效的解决方案

文章目录 前言原因1、Mybatis Plus版本的问题2、Mapper.xml文件中SQL语句格式问题3、Mybatis Plus默认分页拦截器问题4、分页参数传参问题5、分页配置的问题 解决方案1、升级对应的Mybatis-plus版本分页插件配置问题3、自定义分页拦截器4、正确的参数5、不同版本的配置文件3.4.…

Hugging Face创始人分享:企业如何在ChatGPT浪潮下实现战略布局

Hugging Face创始人兼首席执行官 Clem Delangue在IBM一年一度的 THINK大会中研讨了当前人工智能发展趋势&#xff0c;特别是ChatGPT模型以及其对行业的影响。他的演讲还涉及到一个关键的议题&#xff0c;在ChatGPT这样的通用模型出现后&#xff0c;企业如何在人工智能领域找到自…

QR 分解cpu程序

1. 代码 Makefile EXE : hello_qrSRC_QR qr_main.c qr_func.c $(EXE): $(SRC_QR)gcc $^ -o $ -lm.PHONY: clean clean:-rm -rf $(EXE) qr_main.c #include "stdio.h"int maqr(double* a,int m,int n,double* q);int main() {int i,j;static double q[4][4],a[4]…

全能相似度计算与语义匹配搜索工具包,多维度实现多种算法,涵盖文本、图像等领域。支持文图搜索,满足您在不同场景下的搜索需求

全能相似度计算与语义匹配搜索工具包,多维度实现多种算法,涵盖文本、图像等领域。支持文图搜索,满足您在不同场景下的搜索需求。 Similarities:精准相似度计算与语义匹配搜索工具包,多维度实现多种算法,覆盖文本、图像等领域,支持文搜、图搜文、图搜图匹配搜索 Similar…