【vjudge训练记录】大一寒假专项训练——并查集

news/2025/1/24 19:15:04/文章来源:https://www.cnblogs.com/longxingx/p/18689804

训练情况

A题

并查集模板,求班级最多人数和班级数,可以使用map进行统计,取父节点塞进map里面,取最大值和size即可

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;const int N = 1e5 + 3;int fa[N];int n,m;int Find(int x){if(fa[x] == x) return x;return fa[x] = Find(fa[x]);
}void Union(int x,int y){x = Find(x); y = Find(y);if(x == y) return;fa[y] = x;
}void solve(){cin>>n>>m;for(int i = 1;i<=n;i++) fa[i] = i;map<int,int> v;while(m--){int x,y; cin>>x>>y;Union(x,y);}for(int i = 1;i<=n;i++) v[Find(i)]++;int ma = 0;for(auto i:v) ma = max(ma,i.second);cout<<v.size()<<" "<<ma<<endl;
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

B题

并查集模板,判断是否在一个集合内,只需要查询两个点的父节点是否相同

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;const int N = 2e5 + 3;int n,m;
int fa[N];int Find(int x){if(fa[x] == x) return x;return fa[x] = Find(fa[x]);
}void Union(int x,int y){x = Find(x); y = Find(y);if(x == y) return;fa[y] = x;
}void solve(){cin>>n>>m;for(int i = 1;i<=n;i++) fa[i] = i;while(m--){int opt,x,y; cin>>opt>>x>>y;if(opt == 1) Union(x,y);else if(opt == 2){if(Find(x) == Find(y)) cout<<"Y"<<endl;else cout<<"N"<<endl;}}
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

C题

维护亲戚的亲戚是亲戚这一传递关系,并查集模板

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;const int N = 5e3 + 3;int n,m,p;
int fa[N];int Find(int x){if(fa[x] == x) return x;return fa[x] = Find(fa[x]);
}void Union(int x,int y){x = Find(x); y = Find(y);if(x == y) return;fa[y] = x;
}void solve(){cin>>n>>m>>p;for(int i = 1;i<=n;i++) fa[i] = i;while(m--){int x,y; cin>>x>>y;Union(x,y);}while(p--){int x,y; cin>>x>>y;if(Find(x) == Find(y)) cout<<"Yes"<<endl;else cout<<"No"<<endl;}
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

D题

并查集模板,只是这次需要维护一下字符串和节点的映射关系,直接使用map维护

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;const int N = 2e4 + 3;int n,m;
int fa[N];
map<string,int> toi;int Find(int x){if(fa[x] == x) return x;return fa[x] = Find(fa[x]);
}void Union(int x,int y){x = Find(x); y = Find(y);if(x == y) return;fa[y] = x;
}void solve(){cin>>n>>m;    for(int i = 1;i<=n;i++) fa[i] = i;int tot = 0;for(int i = 1;i<=n;i++){string s; cin>>s;toi[s] = ++tot;}while(m--){string x,y; cin>>x>>y;Union(toi[x],toi[y]);}int k; cin>>k;while(k--){string x,y; cin>>x>>y;if(Find(toi[x]) == Find(toi[y])) cout<<"Yes."<<endl;else cout<<"No."<<endl;}
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

E题

并查集模板,只是这次变成二维平面,点 \((x,y)\) 对应的节点是 \(n \timnes (x-1) + y\),其中 \(n\) 为行数

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;const int N = 2e6 + 3;int n,m,k;
int fa[N];int Find(int x){if(fa[x] == x) return x;return fa[x] = Find(fa[x]);
}void Union(int x,int y){x = Find(x); y = Find(y);if(x == y) return;fa[y] = x;
}void solve(){cin>>n>>m>>k;for(int i = 1;i<=n*m;i++) fa[i] = i;while(k--){int x,y; cin>>x>>y;Union(x,y);}set<int> ans;for(int i = 1;i<=n*m;i++) ans.insert(Find(i));cout<<ans.size()<<endl;
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

F题

考察比较灵活的并查集,我们需要维护数字集合中的最大值,所以我们需要把父节点设为集合内数字的最大值+1,在每次修改数字的时候,直接查询父节点

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;const int N = 1e6 + 3;int fa[N];int Find(int x){if(fa[x] == x) return x;return fa[x] = Find(fa[x]);
}void solve(){int n; cin>>n;for(int i = 1;i<=N-3;i++) fa[i] = i;vector<int> a(n + 1);for(int i = 1;i<=n;i++) cin>>a[i];for(int i = 1;i<=n;i++){a[i] = Find(a[i]);fa[a[i]] = Find(a[i])+1;cout<<a[i]<<" ";}
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

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

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

相关文章

2024山西中考数学第15题

如图,在 $▱ABCD$ 中,$AC$ 为对角线,$AE⊥BC$ 于点 E,点 $F$ 是 $AE$ 延长线上一点,且 $∠ACF = ∠CAF$,线段 $AB$,$CF$ 的延长线交于点 $G$,若 $AB=\sqrt{5}$,$AC=4$,$\tan∠ABC=2$,则 $BG$ 的长为_________.解析 勾股定理+建系 过程 解:由题得,$AE=2$,$BE=1$。…

云--云计算设计模式

https://www.cloudpatterns.org/异常

CTS2025Day1T1 倾诉

以下定义 \(lim=\lceil\log a\rceil\)。 首先结构一定是形如将整个序列划分成若干子段,形如 \((l,r,p)\) 的结构,其中 \(p\ge r\),并且 \(p\) 严格单调递增,那么这一段的操作次数就是 \(p-l\),不妨令 \(f(l,r,p)\) 表示对应的权值。由于 \(a_n\ge 1\),所以说明最后一段的…

你希望 Windows 在你离开电脑多久后要求你重新登录? windows 11 家庭版 去掉登录开机密码

你希望 Windows 在你离开电脑多久后要求你重新登录? 你的电脑的电源设置阻止显示某些选项。windows 11 家庭版 去掉密码方法一、使用用户账户关闭登录密码 【不可行】1、点击“开始菜单”,在“搜索”框中输入“netplwiz”,并点击打开。2、在弹出的窗口中,选中需要更改的账户…

pig--apache

https://pig.apache.org/

Hugging Face 视觉语言小模型 SmolVLM 可在手机运行;OpenAI 推出智能体 Operator 联网执行任务

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

[CF1260D] A Game with Traps

A Game with Traps の 传送门首先,假设带 \(p\) 个人可以,那么带更少的人一定可以。 那么,可以二分带多少个人。 设当前二分带 \(x\) 个人。 带敏捷值最大的 \(x\) 个士兵肯定最好。 先去除当前无用的陷阱,即 \(d_i\) 小于等于 \(x\) 个士兵中的最小敏捷值。 陷阱区间不相交…

[CF549F] Yura and Developers

A Game with Traps の 传送门首先,假设带 \(p\) 个人可以,那么带更少的人一定可以。 那么,可以二分带多少个人。 设当前二分带 \(x\) 个人。 带敏捷值最大的 \(x\) 个士兵肯定最好。 先去除当前无用的陷阱,即 \(d_i\) 小于等于 \(x\) 个士兵中的最小敏捷值。 陷阱区间不相交…

Vue2_Vue 实例

本文主要介绍 Vue 实例,包括如何创建一个 Vue 实例、实例中的数据和方法、实例生命周期钩子以及生命周期的图示,实例的数据和方法主要涉及数据 data 对象,在实例生命周期钩子中简单讲解了模板编译Vue 实例创建一个 Vue 实例 每个 Vue 应用都是通过用 Vue 函数创建一个新的 V…

AI应用实战课学习总结(7)聚类算法分析实战

本文介绍了机器学习中的聚类场景问题,常用的聚类算法 以及 分类和聚类的简单对比,最后再次通过电商订单数据做用户画像的案例做了一次聚类实战,相信对你理解聚类应用应该有所帮助。大家好,我是Edison。 最近入坑黄佳老师的《AI应用实战课》,记录下我的学习之旅,也算是总结…

飞行器半实物联合仿真:技术解析与应用实践

1.背景介绍 当前,飞行器已成为大国博弈复杂场景中的重要角色,其技术经过多次实践不断发展,性能持续提升,整体效能显著增强。随着计算机技术和系统仿真技术的发展,利用计算机模拟和仿真构造一个虚拟飞行器的飞行控制系统已成为可能。这种仿真环境不仅可以定量描述飞行器在真…

函数计算百炼新春活动正式上线!三步赢取蛇年精美好礼

目前,人工智能(AI)正不断突破创作的边界,无论是文字、图像还是视频,AI都能以其卓越的效率和创造力为创作者提供助力。然而,如何让用户快速体验到此类 AI 创作应用,依然是一个需被解决的问题。为此,我们特别推出了基于函数计算百炼模型服务的 AI 创作方案,从剧本创作到…