3 条题解
-
1
并查集的板子题 并查集是一种树形的数据结构,顾名思义,它用于处理一些不交集的合并及查询问题。它支持两种操作: 查找(Find):确定某个元素处于哪个子集; 合并(Union):将两个子集合并成一个集合。 1. 初始化,循环枚举n个点,初始每个点的祖先就是自己,fa[i]=i; 2. 路径压缩的查找(把在路径上的每个节点都直接连接到根上) int find(int x) { if (x != fa[x]) // x 不是自身的父亲,即 x 不是该集合的代表 fa[x] = find(fa[x]); // 查找 x 的父亲的父亲直到找到代表也就是祖先,于是顺手路径压缩,将fa[x]直接设为该值,此时的树形结构就是一个只有2层的树。 return fa[x]; } 3. 合并 void unionSet(int x, int y) { // x 与 y 所在家族合并 x = find(x); y = find(y); fa[x] = y; // 把 x 的祖先变成 y 的祖先的儿子 } 详情可见OI WIKI介绍
-
0
并查集(模板)
/* 树形数据结构--并查集 概念:有若干个集合,每个集合均为一棵树 主要用处:处理一些合并及查询问题速度较快 处理问题与函数:合并(merge)->将若干个点合并到一个或多个集合里(构成一棵树或森林)或将多个集合合并成一个集合 查询(find)->询问该子节点的根(root) 其他(other)->求集合数量(number) 用fa数组存储父节点,难点便迎刃而解 代码实现: 查询: if (x!=fa[x])find(fa[x]); return fa[x]; 合并: int tx=find(x); int ty=find(y); if (tx!=ty)fa[tx]=ty; 其他: if(fa[x]==x)ans++; 压缩: find函数每次查找父节点,下次再查找运行时间变慢,所以每次求出父节点便存起来 if (x!=fa[x])fa[x]=find(fa[x]); return fa[x]; */ #include <bits/stdc++.h> using namespace std; int n,m,q,fa[5010]; int find(int x){ if (x!=fa[x])fa[x]=find(fa[x]); return fa[x]; } void merge(int x,int y){ int tx=find(x); int ty=find(y); if (tx!=ty)fa[tx]=ty; } int main(){ cin>>n>>m>>q; for (int i=1;i<=n;i++)fa[i]=i; int x,y; for (int i=1;i<=m;i++){ cin>>x>>y; merge(x,y); } for (int i=1;i<=q;i++){ cin>>x>>y; if (find(x)==find(y))cout<<"Yes\n"; else cout<<"No\n"; } return 0; }
- 1
信息
- ID
- 917
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 32
- 已通过
- 20
- 上传者