并查集
文章平均质量分 60
chen_minghui
这个作者很懒,什么都没留下…
展开
-
566D - Restructuring Company 并查集
题意:并查集两点之间合并和一个区间中所有点合并。查询两点是否在同一集合里思路:前者直接合并,后者由于是一个区间段,区间所在集合编号确定。下次这个区间再有合并操作了,直接拿区间编号合并。所以用个数组记录,当前集合下一个集合的编号。#includeusing namespace std;const int maxn = 2*1e5+10;int f[maxn],a[maxn];//a[i原创 2017-07-16 19:53:14 · 521 阅读 · 0 评论 -
HDU 1598 find the most comfortable road 二分+bfs or 并查集枚举
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1598题意中文题:找到一条s到t的路,其中边的差值最小,输出这个差值,如果不存在输出-1。思路1.枚举差值,先将边保存起来,获得最大最小边权差值(二分的上界下界)。枚举一个差值,将符合差值的边加入图中,跑bfs,看从s是否能够到达t,我这儿输出-1的处理是给上界是加了个1,如果最后答案出界了,说明不存在s到原创 2017-08-31 16:05:08 · 217 阅读 · 0 评论 -
HDU-3938 Portal 克鲁斯卡尔思想 (离线并查集)
这题题目意思没看懂,看了题解之后才明白,写一下我的理解题意:一个无向图,给q个询问,每个询问一个l值,询问边的大小限定在l以内,能生成路径的条数。可以理解为限定边的最大长度后,仍有多少对点之间还是连着的。有个隐藏条件:不能成环,不然可以构成无数条路径。考虑kruskal过程,边加入集合中的顺序是从小到大加入,最大边是限定的。没加边前每个集合都是单个结点,结点数量为1,集合合并,合并后的集合路径原创 2017-07-18 20:36:50 · 309 阅读 · 0 评论 -
POJ 2236 Wireless Network 并查集
题意:地震之后所有的电脑之间的通讯都断了,给定n电脑的坐标,然后给一些修复操作,和一些询问。如果两台电脑之间的距离不超过d就能互相通讯。询问是否连通。思路:最多大概2*1e7次循环,这个还真没想到,所以直接用并查集暴力一个一个的扫,把已修好的全部判断一遍看距离是否小于d,加入集合就行了。#include#include#includeconst int maxn = 1010;in原创 2017-07-17 21:20:45 · 216 阅读 · 0 评论 -
POJ - 2492 A Bug's Life 种类并查集
题意:给定一些昆虫的交配关系,问是否存在同性恋。思路:同食物链,这里是分成两个种类,n乘个2继续用挑战上的思路#includeconst int N = 2010;int f[2*N];int Find(int x){ return f[x]==x?x:f[x]=Find(f[x]);}bool same(int x,int y){ return Find(x)==F原创 2017-07-17 21:02:46 · 223 阅读 · 0 评论 -
POJ 1182 食物链(并查集)
动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类。 第二种说法是"2 X Y",表示X吃Y。 此人对N个动物,用上述两种说法,一句接一句地原创 2017-07-17 20:51:36 · 328 阅读 · 0 评论 -
ZOJ - 3261 Connections in Galaxy War 并查集 离线操作
题意:在一个星系中,存在n个星球,每个星球都有一定的力量值,一些星球之间有建立通道方便在有需要的时候向比自己强的星球寻求帮助,也就是力量值比寻求帮助的星球要大。在星球大战中,给出2种类型的命令:1.query a 表示查询比a强的中最强的星球编号,如果最强编号有多个与a相连,选择编号小的那个。2.destroy a b 表示在大战中a和b之间的通道被毁,a b断开联系。先给出星球个数原创 2017-07-18 09:47:39 · 261 阅读 · 0 评论 -
hdu 1856 More is better 并查集找最大集合
题意:给出一些人物关系,他们都是朋友,找最大朋友圈#includeconst int maxn = 10000010;int f[maxn],a[maxn];int Find(int x){ if(x==f[x])return x; else return f[x]=Find(f[x]);}void Merge(int x,int y){ int xx=Find(x);原创 2017-07-16 20:37:14 · 229 阅读 · 0 评论 -
hdu 1325 Is It A Tree? (并查集)
题意:输入一些边之间的关系,判断是不是一颗树思路:1.不能成环 2.不能有多个根#include#include#include#include#include#includeusing namespace std; const int maxn =100001;int f[maxn];int r[maxn];bool flag=0;int Find(int x){原创 2017-07-16 19:59:53 · 192 阅读 · 0 评论 -
codeforces 722C Destroying Array 并查集带权
题意:含有n个元素的数组,每次破坏一个数字,每次计算连续的序列元素之和,取出最大值。直到全部破坏为止。思路:逆向思维,往数组里添数字,每次添加看左右位置是否添加,有连续的就合并,将位置看作要合并的元素,起始时每个位置权值就等于a数组中对应位置的值。#include#include#include#define ll long long#define Max(a,b) (a)>(b)原创 2017-07-16 22:55:23 · 278 阅读 · 0 评论