
并查集
不哭的超人
愿你孤独的努力终有回报,愿你前行的路上有人相伴。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
P1621 集合(并查集+素数)
P1621 集合解题思路:先用线性筛法求出100000以内的所有素数,将每一个素数的倍数都放在vector,然后从p开始,两两合并。最后再统计一下祖先节点有几个。#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef long double lf;typedef pair<int,int>P;const int inf = 0x7f7f7f7f;const int N = 1e5+原创 2020-11-30 20:56:36 · 235 阅读 · 1 评论 -
Rank of Tetris(并查集+拓扑排序)
Rank of Tetris解题思路:因为题目中存在两个点分数相等的情况,所以可以使用并查集将它们合并起来。构图的时候使用每个点的祖先节点构图。对构造完成的图进行拓扑排序,使用队列每次只能让入度为0的点出队,判断是否有环。如果队列中存在两个及两个以上的点,这说明信心不完全,导致这些不可以比较,如果有环的话,则就说明有矛盾。#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef long double原创 2020-11-24 16:07:33 · 306 阅读 · 0 评论 -
连通 OR 不连通
连通 OR 不连通解题思路:这题是用并查集判断两个点是否在同一个连通块。因为中途还需要把一些边去掉,于是可以采用离线,先把需要删除的边都删除,从后往前处理,遇到删除的边,再添上去。#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int,int>P;const int N = 1e5+10;const ll mod = 1e9+7;int random(int原创 2020-11-21 14:09:58 · 265 阅读 · 0 评论 -
Conquer a New Region(并查集+贪心)
Conquer a New Region解题思路: 先按照边的权值从大到小排序一下。对于一条边的两个点所在的集合,这条边的权值一定是小于等于已经处理过的边,所以就会有两种情况,按照贪心来看,这两种情况,选择其中打的。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 2e5+10;struct node{ int u,v; ll w; node(){}原创 2020-11-18 17:50:01 · 359 阅读 · 0 评论 -
P3295 [SCOI2016]萌萌哒(并查集+ST表倍增)
P3295 [SCOI2016]萌萌哒解题思路:题目要求的是两个区间对应的值相等。假设先不看区间,如果求的是两个点相等,那么只要用并查集把题目相等的点连接起来求连通块的个数k,对于一个正整数来说,首位肯定是不能0,所以答案应该就是9*10(k-1)。但是本题是要求区间对应相等,那么可以用st表,有相等的尽可能相等合并。最后再来遍历一遍st表,把后面一段相对的往前合并。类似于线段树的pushdown,最后再来统计一下连通块的个数。#include <bits/stdc++.h>using n原创 2020-11-17 14:43:42 · 217 阅读 · 0 评论 -
P4047 [JSOI2010]部落划分(并查集+二分)
P4047 [JSOI2010]部落划分解题思路:用二分来枚举答案。采用并查集将两个集合的距离小于mid的连接起来,计算一下出现了几次祖先,相当于被分成了几部分。与k进行比较。#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int,int> pii;const int N=1e4+5;struct node{ ll x,y;}a[N];int vis原创 2020-11-12 18:36:17 · 167 阅读 · 0 评论 -
P2294 [HNOI2005]狡猾的商人(带权并查集+前缀和)
P2294 [HNOI2005]狡猾的商人解题思路:这里用带权并查集记录每个节点与自己祖先的距离。如果两个点没有相同的祖先,那么需要把这两个集合合并起来,用已经的点确定p点到q的距离,num[p] = num[t]-w-num[s];这个很重要。如果两个点有共同的祖先,那么判断一下两个点之间的距离是不是w就可以了。#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int,int原创 2020-11-11 22:46:08 · 318 阅读 · 0 评论 -
E. Merging Towers(并查集+合并式启发)
E. Merging Towers解题思路:对于每一次的答案,都是在塔里面连续出现的区间-1,比如[[5,1],[2],[7,4,3],[6]],需要移动五次,这五次就是[5],[1],[2],[7],[4,3],[6],有6个减一。启发式合并就是小的向大的合并。比如合并u和v这两个塔,需要用小塔向大塔上移动,对于小塔上面的每一个盘子,-1或者+1,寻找它们在上一次最后被移动到哪个塔上,也就是找祖先节点,接着判断一下这个祖先节点是否等于u。如果相等,则说明这可以合并成一个连续的序列,所以需要在原来答案的基原创 2020-11-11 13:37:04 · 189 阅读 · 0 评论 -
旅旅旅游
题目:旅旅旅游题解:分别求出以1为起点的最短距离,和以n为起点的最短距离。然后对每条边进行判断,判断这条边是否为最短路径的边。最后再把剩下的边判断一下就好了。#include <bits/stdc++.h>#include <cstdlib>using namespace std;typedef long long ll;typedef pair<ll,i...原创 2020-10-19 15:30:30 · 182 阅读 · 0 评论 -
D. Secret Passwords
题目:D. Secret Passwords总结:题目要求输入必须小写的英文单词。所以对于一串字符串去掉重复的最多剩下26个字母。对于一串字符串,每两个不同的,一定是表示同一个。所以这时候就可以用并查集。但这里用并查集需要注意一点就是并查集中每个点的父亲节点只有一个,每个节点的儿子节点也只有一个。所以我加了一个这个if(fx > fy) swap(fx,fy);#include <...原创 2020-10-19 15:29:32 · 553 阅读 · 0 评论 -
Is There A Second Way Left?
题目:Is There A Second Way Left?总结:先用kruskal把最小生成的边都放入队列中,顺便判断一下这个图是不是连通图。如果不是连通图,那么肯定不可以搞最小生成树了。如果满足,接下来求次小生成,把最小生成树里的每一个边都去掉,用kruskal算出其他边的最小值,从这些里面找一个最小的,但也可以构造不成一个次小生成树,所以可以判断一下这个次小生成树是否连通。#includ...原创 2020-10-19 15:40:17 · 227 阅读 · 0 评论 -
Arctic Network
题目:Arctic Network总结:这道题是将原本要求P-1条边,变成求P-1-S条边里的最大值,这P-1-S条边是要求从小到大排#include <stdio.h>#include <set>#include <math.h>#include <queue>#include <string.h>#include <...原创 2020-10-19 15:40:22 · 498 阅读 · 0 评论 -
Borg Maze
题目:Borg Maze总结 :通过bfs+kruskal,用bfs找出两点之间的距离,在找道题目中两点之间的距离可能会有多个,但是后面的kruskal会通过排序把小的排在前面。所以不需要刻意的用bfs求两点之间的最短距离。然后就是kruskal的运用。结和代码#include <stdio.h>#include <set>#include <queue&...原创 2020-10-19 15:40:27 · 312 阅读 · 0 评论 -
Is It A Tree?
题目:Is It A Tree?总结:题目是需要构建一棵树。首先图中不能有环,用并查集判断,然后图一定是个连通图,再判断每个点的根结点是否相等。注意还有可能是空树。#include <stdio.h>#include <vector>#include <set>#include <algorithm>using namespace std...原创 2020-10-19 15:39:44 · 385 阅读 · 0 评论 -
小希的迷宫
题目:小希的迷宫思考:用并查集判断是否有环,然后再判断边的个数+1是否等于点的个数#include <stdio.h>#include <vector>#include <set>#include <algorithm>using namespace std;const int N = 1e5+5;set<int>a;...原创 2020-10-19 15:39:39 · 158 阅读 · 0 评论 -
A Bug‘s Life
题目:A Bug’s Life总结:带权并查集,vis[x]:x与x的根结点之间的关系,1表示两个相异,0表示两个相同。每次查找x和y的根结点的时候,通过路径压缩处理某个结点与某个结点的根结点之间的关系。判断x和y的根结点是否一样,并且判断x与根结点和y与根结点的关系是否相同,如果相同则说明它们有一对是同的,#include <stdio.h>#include <stri...原创 2020-10-19 15:39:33 · 490 阅读 · 0 评论 -
Supermarket
题目:Supermarket思考:贪心+并查集,先按照利润进行降序排序,然后用并查集查询某一天的前几天是否还可以安排新的,所以用f[k] = k-1表示,可以通过并查集依次往前找是否可以查入,如果找到0则表示不可以#include <stdio.h>#include <string.h>#include <algorithm>using namespa...原创 2020-10-19 15:38:33 · 480 阅读 · 0 评论 -
How Many Answers Are Wrong
题目:How Many Answers Are Wrong参考博客:https://www.cnblogs.com/liyinggang/p/5327055.html思考:这题让我懂了带权并查集和向量偏移的思想.dis[x]保存的是x和它根结点之间的距离,这段递归就是,先递归到要根结点,然后再将某点到根结点的距离与根结点,依次返回去。可以自己模拟一遍int find(int x){ ...原创 2020-10-19 15:38:38 · 332 阅读 · 1 评论 -
The Suspects(POJ1611)
DescriptionSevere acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized as a global threat in mid-March 2003. To minimize transmission to others, the best stra...原创 2020-10-19 15:40:48 · 155 阅读 · 0 评论 -
并查集
这是我再一次对并查集的理解,这次比上次理解的更加深刻了题目是这样输入输入的第一行包含两个用空格隔开的正整数n和k,其中n不超过100,k不超过n-1。之后的k行中,每行包含两个用空格隔开的正整数x和y,表示将x元素所在的集合和y元素所在的集合合并至同一个集合。保证x和y均在1至n之间。最后一行中,包含两个正整数,表示需要判断是否在同一个集合的元素编号。输出共一行,包含字符串“YES”...原创 2020-10-19 15:28:02 · 211 阅读 · 0 评论