并查集
明天见A
这个作者很懒,什么都没留下…
展开
-
奇偶游戏
奇偶游戏一、扩展域写法具体代码如下#include<iostream>#include<cstring>#include<unordered_map>using namespace std;const int N = 40010, Base = N / 2;int n, m;int p[N];unordered_map<int, int> S;int get(int x){ if(!S.count(x)) S[x] =原创 2021-04-02 16:27:13 · 97 阅读 · 0 评论 -
食物链
食物链一、带边权的并查集另外修改一下路径压缩的代码,让结点加上父结点距祖宗结点的距离即可//路径压缩int find(int x){ if(x != p[x]){ int t = find(p[x]); d[x] += d[p[x]]; p[x] = t; } return p[x];}完整代码如下#include<iostream>#include<cstring>using n原创 2021-03-31 20:17:25 · 117 阅读 · 0 评论 -
A Bug‘s Life POJ - 2492【并查集】
A Bug’s Life POJ - 2492题目思路:维护带边权的并查集,性别与根结点相同距离对2取模就是0,不同就是1具体代码如下#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int N = 2010;int n, m;int p[N], d[N];int find(int x){ if(p[x] != x){ int t =原创 2021-02-07 17:45:03 · 60 阅读 · 0 评论 -
Navigation Nightmare POJ - 1984【并查集】
Navigation Nightmare POJ - 1984题目思路:先把线路存储下来,题目没有明说询问的时间是非递减的,实测是非递减的,如果不是就有点麻烦了。设置两个距离数组,分别存储水平方向和竖直方向上点距根结点的距离,设置北为正南为负,西为负东为正(这里随心所欲)具体代码如下#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<cstd原创 2021-02-07 17:19:16 · 77 阅读 · 0 评论 -
Supermarket POJ - 1456【并查集】
Supermarket POJ - 1456题目思路:贪心 + 并查集优化,先把数对按照价值从大到小排序,然后依次枚举,枚举到不能用的就跳过,有点像kruskal?具体代码如下#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;const int N = 10010;int n;int p[N];str原创 2021-02-06 19:18:43 · 102 阅读 · 0 评论 -
How Many Answers Are Wrong HDU - 3038【并查集】
How Many Answers Are Wrong HDU - 3038题目思路:每次给出的数据都是一段值的和,如1 10 100,意思是1~10之和是100,我们把它设置成左开右闭的区间(0, 10],较为容易计算,这个题本意是维护并查集中点与根结点的边权,合并的时候路径压缩时需要注意,再者就是计算距离如下图合并px、py时我们要求出px距py多远得到等式Vpx = Vxy + Vy - Vx,Vxy就是题目的输入Vx和Vy都能在程序运行时存储,如果两个点本身就在一个集合那就比较value[x]原创 2021-02-06 15:37:40 · 64 阅读 · 0 评论 -
How Many Tables HDU - 1213【并查集】
How Many Tables HDU - 1213题目思路:并查集,开始时需要n个桌子,每合并一次需要桌子数量-1具体代码如下#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int N = 1010;int n, m;int p[N];int find(int x){ if(p[x] != x) p[x] = find(p[x]);原创 2021-02-06 13:17:25 · 65 阅读 · 0 评论 -
The Suspects POJ - 1611【并查集】
The Suspects POJ - 1611题目思路:并查集模板题,开一个cnt数组维护集合中点的数量,最后输出0号点所在集合中点的数量就可以了具体代码如下#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int N = 30010;int n, m;int p[N], cnt[N];int group[N];int find(int原创 2021-02-06 12:57:52 · 71 阅读 · 0 评论 -
Wireless Network POJ - 2236【并查集】
Wireless Network POJ - 2236题目思路:并查集,把维修过且距离在d之内的放入同一个集合,之后判断具体代码如下#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int N = 1010;struct Point{ //存各个点的坐标 int x, y;}point[N];int n, d;int p[N];in原创 2021-02-06 12:16:20 · 78 阅读 · 0 评论 -
程序自动分析【并查集】
程序自动分析题目思路:一个简单的并查集问题,不过需要离散化把大的数值映射成小的,先把相等的放在一个集合,最后在判断不相等的是否与相等的冲突具体代码如下#include<iostream>#include<unordered_map>using namespace std;const int N = 2000010;int n, m;int p[N];unordered_map<int, int> S; //这里用hash表来映射就可以,也可以自己原创 2021-02-02 08:52:07 · 132 阅读 · 0 评论 -
搭配购买【并查集】
搭配购买题目思路:考察并查集和01背包,先把需要搭配购买的物品放在同一个集合再去用01背包选择最大值具体代码如下#include<iostream>using namespace std;const int N = 10010;int n, m, k;int p[N], mey[N], w[N];//mey代表价钱,w代表价值int f[N];int find(int x){ if(p[x] != x) p[x] = find(p[x]); retur原创 2021-02-01 11:34:31 · 171 阅读 · 0 评论 -
格子游戏【并查集】
格子游戏题目思路:若能够形成自环,则两点在连线之前属于同一个集合。并查集裸题,不过需要把二维状态下坐标映射到一维,这里用一个cnt不断自增来映射,也可以将x,y从0开始a[x][y] = n*x+y代码如下#include<iostream>using namespace std;const int N = 210;int n, m, cnt;int p[N*N];int a[N][N];int find(int x){ if(p[x] != x) p[x]原创 2021-02-01 11:11:03 · 197 阅读 · 0 评论