
并查集
文章平均质量分 55
stdwal
天演在化,功成在学。知海无涯,见花问道。
展开
-
数据结构-并查集
并查集可以高效的查询元素a和元素b是否属于同一组并且合并元素a和元素b所在的组。并查集虽然可以进行合并操作,但是无法进行分割操作。在并查集中,哪个节点是哪个节点的父亲以及树的形状等信息无需多加关注,整体组成一个树形结构才是重要的。对于每棵树,记录这棵树的高度(rank)。合并时如果两棵树的rank不同,那么从rank小的向rank大的连边。此外,通过路径压缩可以使并查集原创 2016-04-26 20:04:43 · 275 阅读 · 0 评论 -
Ural1671-Anansi's Cobweb
给定一个图中有n个点m条边,往图中不断删边并每次输出图被分成了几块。 使用并查集,相互连边的点放到同一个子集中去,这样一来就可以知道图被分成了几块。 但是并查集只能往里面加边却难以删掉一条特定的边,因此先用不会被删除的边建图,遍历并查集可得到删掉所有特定的边后图被分成的块数,然后往里添加最后被删的那条边,不断往前增加,知道添加到第二条被删的边为止。 在增加边时可以先判断边的两个端点u,v是否处原创 2016-11-19 11:10:59 · 493 阅读 · 0 评论 -
Ural1272-Non-Yekaterinburg Subway
简单的并查集问题,先用tunnel连图后再检查bridge的连通,如果不连通就需要用一座桥连通两个岛。#include <cstdio>const int maxn = 10000 + 5;int par[maxn];int rk[maxn];void init(int n) { for (int i = 0; i < n; i++) { par[i] = i;原创 2016-11-30 14:35:58 · 392 阅读 · 0 评论 -
Ural1709-Penguin-Avia
用并查集先筛选掉以及连通的边,然后再将未连通边加上即可。#include <cstdio>#include <cstring>#include <vector>using namespace std;const int maxn = 100 + 5;char mat[maxn][maxn];char ans[maxn][maxn];struct edge { int u, v;};v原创 2016-11-30 13:54:29 · 413 阅读 · 0 评论 -
POJ2395-Out of Hay
最小生成树的又一变形题,寻找最小生成树中的最大权值边。#include #include using namespace std;const int maxn = 2005;const int maxm = 10005;int par[maxn];int rk[maxn];void init(int n) { for (int i = 0; i < n; i++)原创 2016-07-22 11:20:17 · 337 阅读 · 0 评论 -
POJ2377-Bad Cowtractors
最小生成树的变形题,最大生成树。这道题显然用Kruskal算法可以直接计算最小生成树的值,但是题目需要判断最小生成树是否存在,因此我们引入变量node_num表示树中的节点数。比较树中的节点树与总节点树即可。ps.为什么是单向边?#include #include using namespace std;const int maxn = 1000 + 10;const原创 2016-07-22 10:33:54 · 368 阅读 · 0 评论 -
POJ1703-Find them, Catch them
这是一道类似于食物链的并查集题目。#include const int maxn = 10e5 + 10;int par[2 * maxn];int rk[2 * maxn];void init(int n) { for (int i = 0; i < 2 * n; i++) { par[i] = i; rk[i] = 0; }}原创 2016-07-09 14:06:07 · 279 阅读 · 0 评论 -
POJ1988-Cube Stacking
这是一题带权值的并查集问题,并在move过程中规定了x, y连边的方向,因此在优化的过程中要记下每个节点到根的相对位置,并通过路径压缩将每个节点挂在每堆的最顶上的元素(父节点)。用数组par纪录每个节点的父节点,数组far纪录每个节点到父节点的相对距离,数组stk纪录以某元素为父节点的堆的节点(方块)数。本题中的关键在于find函数通过递归方式进行的路径压缩,find函数的递归实现是本题的中心原创 2016-05-09 21:33:15 · 312 阅读 · 0 评论 -
POJ2236-Wireless Network
以电脑之间的连通关系建立并查集,连接符合条件的电脑并检查连通性即可。#include #include #include using namespace std;typedef pair P;const int MAXN = 1001;int par[MAXN+5];int high[MAXN+5];bool status[MAXN+5];P com[MAXN+5];原创 2016-05-16 09:05:07 · 404 阅读 · 0 评论 -
POJ1182-食物链
该题有三种动物,我们可以把一个并查集分成三份:x,x+n, x+2n分别表示A,B,C三种动物。当x与y是同类时,x与y可能是三种动物中的任意一种,则将(x, y)、(x+n, y+n)、(x+2n, y+2n)合并。当x吃y时,x与y可能是三种捕食关系中的一种,则合并A吃B(x, y+n)、B吃C(x+n, y+2n)、C吃A(x+2n, y)。于是,当x,y处于同一个n内表示x,y原创 2016-04-27 12:52:38 · 342 阅读 · 0 评论 -
Ural1982-Electrification Plan
有n个城市,其中k个城市有发电站,给出每个城市之间连接电线的花费,要求使每个城市通电的最小花费。 维护并查集用kruskal算法解决MST问题,标记每个发电站,在连边时取发电站为代表元素连边,连边时要判断两个城市的父节点是否是两个不同的发电站。#include <cstdio>#include <vector>#include <algorithm>using namespace std;co原创 2016-11-26 18:27:26 · 421 阅读 · 0 评论