![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并查集
HumveeA6
这个作者很懒,什么都没留下…
展开
-
并查集模板
rt,没啥好说的。一定记得要把每个par初始化为自己!!!!int find(int x){ if (x == par[x]) return x; else return par[x] = find(par[x]);//后面这一块不要漏了par[x]!!!否则就是不带路径压缩(有时候有用)}void unite(int x, int y...原创 2018-02-03 00:34:31 · 176 阅读 · 0 评论 -
洛谷p1955 (NOI2015)
题目思路并不复杂…只要想到并查集就好… 不过还有一点…xi和xj数可能很大,那么我们是不可能搞那么大的数组的…所有应该利用map或者哈希之类的离散化到一个比较小的范围内… 对于所有要求相等的条件,把xi和xj合并,所有相等的都合并之后,开始检查不相等的条件,此时如果发现条件中有一组数之前已经被合并了,那么说明这个问询是有矛盾存在的。#include#include#include#i原创 2018-02-06 13:37:14 · 256 阅读 · 0 评论 -
POJ1703
题目似乎并没有什么特别的…类似那道经典的食物链或者关押罪犯,利用并查集的补集去做就好了;唯一要注意的就是本题卡cin,换成scanf和getchar就能过; 利用cin的懒人写法#include<cstdio>#include<iostream>#include<algorithm>#include<string>using names...原创 2018-03-06 22:29:34 · 291 阅读 · 0 评论 -
Aizu2170/AOJ2170
这题我看到最好的做法就是不带路径压缩的并查集,简单明了。其实题目很类似于平时的并查集模板题,但是有一个不同的地方就是会不停地添加标记,相当于改变某一部分的祖先,那么如果按照平时的做法去路径压缩的话就会出现问题,因此我们只要把路径压缩那一块去掉就好了。 题目中当mark一个点时,我们就用fa[x]=x去更新某个点,使它作为一个并查集的根节点,然后如果要查询离x最近的mark点,那么我们就逐渐网上找...原创 2018-03-07 08:33:29 · 350 阅读 · 1 评论 -
洛谷P1197
如果从正面去做,每干一个点跑一次tarjan之类的,肯定会tle;所以不妨反(倒着)着来,把摧毁星球变成添加星球,这样就是每次跑并查集了。至于如何快速确定联通块的数量嘛,并查集每连一条边就是减少了一个联通快,不过要注意的是初始的时候联通快的数量是n-k!!!!此外还是有不少小坑需要留意的。#include<cstdio>#include<iostream>#incl...原创 2018-03-06 17:38:30 · 330 阅读 · 0 评论 -
L3-003. 社交集群
题目难就难在题意理解上,看懂了明显就是一个很裸的并查集。题目的意思是,假如1,3都喜欢某个东西,同时3,5都喜欢某个东西,那么1,3,5就是一个兴趣团体。#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<vector>...原创 2018-03-25 22:23:15 · 173 阅读 · 0 评论