并查集
洞·爺·湖
No one is an island,entire of itself;never send to know for whom the bell tolls.It told for thee.
展开
-
食物链————AcWing
题目链接 https://www.acwing.com/problem/content/242/ 思路 扩展域并查集的经典题,本题一共有三个域,同类域,捕食域和天敌域,分别对应x,x+n,x+n+nx,x+n,x+n+nx,x+n,x+n+n。具体实现看程序备注(并查集基本模板操作就没注释了)。 #include<bits/stdc++.h> using namespace std; int fa[160000]; int原创 2021-03-21 15:14:39 · 120 阅读 · 0 评论 -
银河英雄传说————牛客
题目链接 https://ac.nowcoder.com/acm/problem/16889 思路 (如果是在AcWing上做这题把size数组的名字改成其他变量名吧)如果是M操作即将a列战舰挪到b列的尾部,那么a列战舰的的每个d都要变,即加上size[find(b)],因为路径压缩,所以只需要头部改变即可,即d[find(a)]=size[find(b)]。 路径压缩的步骤首先要找到根节点root,然后计算父结点到上一个父结点的距离d[p[x]],d[x]初始是x到p[x]的距离,加完后是d[x]=d[x原创 2020-12-30 11:16:19 · 179 阅读 · 0 评论 -
程序自动改错————AcWing
题目链接 https://www.acwing.com/problem/content/239/ 思路 看了算法进阶指南和别人的题解才明白这题需要用离散化处理10的9次方的范围,本题需要将所有待验证的组,即第三个值为0的边,全部先存放起来,这里采用pair<int,int>类型的vector存放。关键是离散化的操作,主要步骤就是存放输入进来的数、利用sort排序,再利用unique去重计数,最后利用lower_bound查找到对应的数,除了离散化部分,剩余的都是并查集的传统操作。 c++代码 #原创 2020-12-30 01:01:05 · 328 阅读 · 0 评论 -
Cube Stacking————北大OJ
题目链接 http://poj.org/problem?id=1611 思路: 题意说是有n块砖,编号从1到n,有两种操作,操作一(‘M’)是把含有x编号的那一堆砖放到含有编号y的那一堆砖的上面,操作二(‘C’)是查询编号为x的砖的下面有多少块砖。传统并查集+维护size和deep两个数组,find函数在路径压缩的过程中需要把深度也依次加上,到代表这里的时候就是这个集合的最大深度,合并过程中要先将被合并的个数加到合并别人的集合的深度上去,然后在合并个数,最后将被合并的集合清零。 c++代码 #include原创 2020-12-29 21:47:58 · 145 阅读 · 0 评论 -
The Suspects————北大OJ
题目链接 http://poj.org/problem?id=1611 思路 传统并查集+维护一个存放每种个数的size数组,本题要找多少个感染的,即找与0有关系的,那么在读入每组数据的时候需要找到每组数据的最小值,以它为代表。 c++代码 #include<algorithm> #include<iostream> #include<stdio.h> using namespace std; const int N=30005; int n,m; int size[N]原创 2020-12-29 21:37:02 · 120 阅读 · 0 评论 -
How Many Tables————杭电OJ
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1213 思路 并查集的基本操作,初始化,查找+路径压缩,数总数。 c++代码 #include<bits/stdc++.h> using namespace std; int p[1005]; int find(int x) { if(p[x]!=x) p[x]=find(p[x]); return p[x]; } int main() { int t; cin>原创 2020-12-29 21:24:56 · 96 阅读 · 0 评论