并查集
这个有时候做关于图的时候会用的到,比如要建成一颗最小生成树,这个并查集就能够用上了,它的作用就大了,可以判断两个点之间是否连通,当两个点之间联通了就说明他们是以集合里面的,也可以用亲戚关系来表达,三个原本互相不认识的人聚到了一起,他们分别是A,B,C;随着三人之间的更加熟悉,A和B是亲戚关系(即A和B之间是连通的),B和C之间也是亲戚关系,所以A和C之间也是亲戚,所以A、B、C都是亲戚关系,即他们都是连通的,这个时候我们怎么知道他们三个是亲戚关系?只需要从他们之中找出一个代表,就相当于氏族族长,你凭什么说你们就是一个家族的,我们的族长是一样的,这样就能够知道了。为了方便,我们把每次最后一个进入家族的当做族长,代码如下。
#include<iostream> using namespace std; const int H=1e5+3; int fa[H]; void build(int N)//初始化,N个人都是互相不认识的 { for(int i=1;i<=N;i++){ fa[i]=i; } return ; } int find(int x)//找到x的族长是谁 { return fa[x]==x?x:fa[x]=find(fa[x]); } bool che(int x,int y)//判断x,y是不是一个族的 { return find(x)==find(y); } void mer(int x,int y)//如果x,y不是一个族的,就把他们并入到一个家族中 { if(!che(x,y)){ fa[fa[x]]=fa[y]; } return ; } int main() { int N,M; cin >> N >> M;//N代表有几个人,M代表他们之间有几种关系(一对一的) build(N); for(int i=0;i<M;i++){ int x; int y; cin >>x >> y; mer(x,y); } int p;//输入p组x和y的关系,如果是一个家族的就输出Yes,否则输出No cin >> p; for(int i=0;i<p;i++){ int x; int y; cin >> x >> y; if(che(x,y)){ cout << "Yes" << endl; } else{ cout << "No" << endl; } } return 0; }
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
【推荐】AI 的力量,开发者的翅膀:欢迎使用 AI 原生开发工具 TRAE
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
· AES 加密模式演进:从 ECB、CBC 到 GCM 的 C# 深度实践
· InnoDB为什么不用跳表,Redis为什么不用B+树?
· 记一次 C# 平台调用中因非托管 union 类型导致的内存访问越界
· [EF Core]聊聊“复合”属性
· 那些被推迟的 C# 14 特性及其背后的故事
· 博客园出海记-开篇:扬帆启航
· 微软开源的 MCP 教程「GitHub 热点速览」
· 记一次 .NET 某汽车控制焊接软件 卡死分析
· 关于布尔类型的变量不要加 is 前缀,被网友们吐槽了,特来完善下
· C#中的多级缓存架构设计与实现深度解析