【ACM程序设计】并查集
并查集
并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题。一些常见的用途有:求连通子图、求最小生成树的Kruskal算法和求最近公共祖先(LCA)等。
并查集的基本操作
- 1.初始化init
- 2.查询find
- 3.合并unionn
//用数组fa[]来存储每个元素的父节点
int fa[MAXN];
//一开始,我们先将它们的父节点设为自己
void init(int n)
{
for(int i=1;i<=n;i++)
fa[i]=i;
}
//查询 找到i的祖先就返回
int find(int i)
{
if(fa[i]==i) return i; //递归出口,当到达了祖先位置,就返回祖先
else
{
fa[i]=find(fa[i]); //路径压缩
return findfa[i]; //不断向上查找祖先
}
}
void unionn(int i,int j)
{
int i_fa=find(i);
int j_fa=find(j);
fa[i_fa]=j_fa; //i的祖先指向j的祖先
}
亲戚
P1551 亲戚 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目背景
若某个家族人员过于庞 大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。
题目描述
规定:x 和 y 是亲戚,y 和 z 是亲戚,那么 x 和 z 也是亲戚。如果 x,y 是亲戚,那么 x 的亲戚都是 y 的亲戚,y 的亲戚也都是 x 的亲戚。
输入格式
第一行:三个整数 n,m,p,(n,m,p≤5000),分别表示有 n 个人,m* 个亲戚关系,询问 p 对亲戚关系。
以下 m 行:每行两个数 i j,表示 i 和 j 具有亲戚关系。
接下来 p 行:每行两个数 P_i,P_j,询问 P_i和 P_j 是否具有亲戚关系。
输出格式
p 行,每行一个 Yes 或 No。表示第 i 个询问的答案为“具有”或“不具有”亲戚关系。
输入输出样例
输入 #1复制
6 5 3
1 2
1 5
3 4
5 2
1 3
1 4
2 3
5 6
输出 #1复制
Yes
Yes
No
#include<iostream>
using namespace std;
#define MAXN 20001
int fa[MAXN];
//一开始,我们先将它们的父节点设为自己
void init(int n)
{
for (int i = 1; i <= n; i++)
fa[i] = i;
}
//查询 找到i的祖先就返回
int find(int i)
{
if (fa[i] == i) return i; //递归出口,当到达了祖先位置,就返回祖先
else
{
fa[i] = find(fa[i]); //路径压缩
return fa[i]; //不断向上查找祖先
}
}
void unionn(int i, int j)
{
int i_fa = find(i);
int j_fa = find(j);
fa[i_fa] = j_fa; //i的祖先指向j的祖先
}
int main()
{
int n, m, x, y, q;
cin >> n;
init(n);
cin >> m;
for (int i = 0; i < m; i++)
{
cin >> x >> y;
unionn(x, y);
}
cin >> q;
for (int i = 0; i < q; i++)
{
cin >> x >> y;
if (find(x) == find(y))
cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
任意点
题意
平面上有若干个点,从每个点出发,你可以往东南西北任意方向走,直到碰到另一个点,然后才可以改变方向。
请问至少需要加多少个点,使得点对之间互相可以到达。
输入描述
第一行一个整数n表示点数( 1 <= n <= 100)。
第二行n行,每行两个整数xi, yi表示坐标( 1 <= xi, yi <= 1000)。
y轴正方向为北,x轴正方形为东。
输出描述
输出一个整数表示最少需要加的点的数目。
解析
这个题目不难,也是一个裸的并查集,不过有一点隐晦,下面解释一下。
首先他只能撞到一个点才能停,看这个图
可以看到1234都是可以相互联系的,而5是独立出来的一个点,要是想要到达5,就要在12或者24之间加一个点,所以这个像什么,就是两个独立的连通块,这样子就很明显是一个并查集了。
这个并查集是当x相同或者y相同的时候,就可以插入在一个块里面。
#include <iostream>
using namespace std;
struct point {
int x;
int y;
} p[110];
int fa[110];
int find(int x) {
if (fa[x] == x)
return x;
fa[x] = find(fa[x]);
return fa[x];
}
void join(int x, int y) {
int fx = find(x);
int fy = find(y);
fa[fx] = fy;
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
fa[i] = i;
cin >> p[i].x >> p[i].y; //scanf("%d")
}
for (int i = 2; i <= n; ++i) {
for (int j = 1; j < i; ++j) {
if (p[i].x == p[j].x || p[i].y == p[j].y) {
join(i, j);
}
}
}
int ans = -1;
for (int i = 1; i <= n; ++i) {
if (fa[i] == i)
++ans;
}
cout << ans << endl;
return 0;
}
【ACM程序设计】并查集的更多相关文章
- ACM数据结构-并查集
ACM数据结构-并查集 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合 ...
- ACM: The Suspects-并查集-解题报告
The Suspects Time Limit:1000MS Memory Limit:20000KB 64bit IO Format:%lld & %llu Description 严重急性 ...
- acm专题--并查集
题目来源:http://hihocoder.com/problemset/problem/1066 #1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256M ...
- ACM: Ubiquitous Religions-并查集-解题报告
Ubiquitous Religions Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Descript ...
- ACM学习历程—SNNUOJ 1110 传输网络((并查集 && 离线) || (线段树 && 时间戳))(2015陕西省大学生程序设计竞赛D题)
Description Byteland国家的网络单向传输系统可以被看成是以首都 Bytetown为中心的有向树,一开始只有Bytetown建有基站,所有其他城市的信号都是从Bytetown传输过来的 ...
- HDU 6109 数据分割 【并查集+set】 (2017"百度之星"程序设计大赛 - 初赛(A))
数据分割 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 5458 Stability(双连通分量+LCA+并查集+树状数组)(2015 ACM/ICPC Asia Regional Shenyang Online)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5458 Problem Description Given an undirected connecte ...
- 2019西北工业大学程序设计创新实践基地春季选拔赛 I Chino with Rewrite (并查集+树链剖分+线段树)
链接:https://ac.nowcoder.com/acm/contest/553/I 思路:离线整棵树,用并查集维护下联通的情况,因为值只有60个,用2的x(1<=x<=60)次方表示 ...
- TOJ3955: NKU ACM足球赛(并查集+map+细节题)
时间限制(普通/Java):5000MS/15000MS 内存限制:65536KByte 描述 NKU ACM最近要举行足球赛,作为此次赛事的负责人,Lee要对报名人员进行分队.分队要遵循如下 ...
随机推荐
- 如何处理异形屏iphone X?
safe area: 默认放置在安全区域以避免遮挡, 但会压缩 在meta中添加viewport-fit=cover: 告诉浏览器要讲整个页面渲染到浏览器中,不管设备是圆角与否,这个时候会造成页面的元 ...
- [邮件服务]Foxmail安装及配置指引(Windows)
操作指引: Step1:访问Foxmail邮箱官网:https://www.foxmail.com/,选择"Windows"版,点击"立即下载". Step2: ...
- mybatis学习一:基于xml与注解配置入门实例与问题
注:本case参考自:http://www.cnblogs.com/ysocean/p/7277545.html 一:Mybatis的介绍: MyBatis 本是apache的一个开源项目iBatis ...
- 描述一下 JVM 加载 class 文件的原理机制?
JVM 中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java 中的 类加载器是一个重要的 Java 运行时系统组件,它负责在运行时查找和装入类文件 中的类. 由于 Java 的 ...
- java-jdbc-all
jdbc相关解析 JDBC(Java DataBase Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语 ...
- C语言形参和实参的区别(非常详细)
如果把函数比喻成一台机器,那么参数就是原材料,返回值就是最终产品:从一定程度上讲,函数的作用就是根据不同的参数产生不同的返回值.这一节我们先来讲解C语言函数的参数,下一节再讲解C语言函数的返回值.C语 ...
- oracle 序列的使用
序列: 是oacle提供的用于产生一系列唯一数字的数据库对象. 自动提供自增的唯一的数值. 共享的数据 主要用于提供主键值 将序列装入内存可以提高访问效率 1.创建序列: 1. 要有创建序列的权限 ...
- web页面性能优化之接口前置
上个Q做了一波web性能优化,积累了一点点经验 记录分享一下. 先分享一个比较常用的接口前置 的优化方案吧 优化前首屏秒开大约在40%左右 首屏秒开大约提高了25% 先发一张优化成果图 前置原因 对于 ...
- PHP基于Thinkphp5的砍价活动相关设计
近期我们公司项目里陆陆续续有很多为了招引新用户的活动推出,砍价的活动由我来负责,我们的项目是在微信浏览器里供用户浏览访问. 大概描述:进入砍价活动列表页选择有意向的商品,用户点击商品图片可以看到WEB ...
- Androd点击一个选框取消其他选框
说明: 我做的体温填报系统需要在填报体温时勾选有无特殊情况 当勾选'无'时需要将用户勾选的其他选框取消 当勾选其他选框时需要将'无'这个选框取消 效果: 代码: addTem.xml <Line ...