并查集
CaprYang
这个作者很懒,什么都没留下…
展开
-
CCPC-Wannafly Winter Camp Day1 (Div2, onsite) E 流流流动 树形dp
题解按照题意将节点之间连线后 每个联通块无环但是整体不一定联通 使用并查集将每个集合都跟0号节点连一根线 建立以0为根的树使用树形dp d[i][0/1]表示以i为根的子树i这个节点1选/0不选的最大收益 DFS从0遍历整棵树回溯后计算d如果不选当前节点x则直接加上子节点y选或者不选 即d[x][0] += max(d[y][0], d[y][1])如果选当前节点x从子节点y转移时候 如果...原创 2019-01-25 17:15:25 · 413 阅读 · 0 评论 -
道路修建 EXT BNUOJ - 51275 并查集 启发式合并
题解题目链接很明显,对于题目所给的操作需要使用并查集处理,但是普通的并查集压缩路径会破坏已有数据,不压缩路径会超时。使用启发式合并并查集求解,在根节点记录当前子树深度,合并时将深度小的作为深度大的子树,这样能保证复杂度为logn。处理过程中顺便顺便记录每条边建立的时间,对于1号操作当uv同属一个根时,则两点可联通。根据当前点深度优先跳深度深的节点(类似于lca不过直接跳就行深度最大为lo...原创 2019-02-27 18:42:31 · 217 阅读 · 0 评论 -
食物链 POJ - 1182 带权并查集
题解使用带权并查集求解,思路参考至两位大佬的博客 dalao A dalao B开两个数组,令f[i]表示i的父节点是谁,r[i]表示i与父节点的关系0表示同类,1表示吃他的父节点,2表示被父节点吃这样设置012的好处是在f[x]=y、f[y]=z关系传递的时候0+0表示x和y、y和z是同类关系则x和z还是同类关系1+1表示x吃y、y吃z按照题意则x被z吃结果也是2被吃的关系,2+2道理相...原创 2019-02-13 21:37:21 · 273 阅读 · 0 评论 -
A Bug's Life POJ - 2492 带权并查集
题解题目大意,给你一些情侣问其中是否有同性恋,输入的数据表示是一对情侣的编号使用带权并查集求解,与题目食物链类似,可以说是食物链的弱化版,定义与父节点关系时用0表示同性1表示异性同性+同性还是同性,异性+异性是同性,同性+异性是异性AC代码#include <stdio.h>#include <iostream>#define fst first#defin...原创 2019-02-13 21:46:14 · 437 阅读 · 0 评论 -
How Many Answers Are Wrong HDU - 3038 带权并查集
题解题目大意,给你若干个区间和,问和之前所说相悖的有多少个,注意多组样例输入使用带权并查集求解,将区间x, y转化为[x, y)的左闭右开区间方便处理令f[i]表示i的父节点是谁,要求父节点大于等于子节点,r[i]表示[i, f[i])区间和为多少,初始化时自身父节点为自身,自然[i, i)为0令f[i]表示i的父节点是谁,r[i]表示区间[i, f[i])的和为多少压缩路径时直接加上父...原创 2019-02-13 22:05:30 · 227 阅读 · 0 评论 -
Codeforces Round #541 (Div. 2) D. Gourmet choice 并查集 拓扑排序
题解题目大意,一个人第一天吃了n份食物第二天吃了m份食物,给你一个n*m的矩阵表示第一天的某份食物和第二天的某份食物哪个更好吃或一样好吃,要求你对每个食物进行打分满足所给矩阵。首先使用并查集将一样好吃的情况缩为一个点进行处理,如果a>b则b<—a建一条单向边,如果a<b则a—>b建一条单向边。初始入度为0的点评分设置为1,使用拓扑排序将当前点指向的点评分对当前点评分+...原创 2019-02-25 17:46:11 · 438 阅读 · 0 评论 -
Codeforces Round #541 (Div. 2) F. Asya And Kittens 并查集 | 启发式合并
题解题目大意,1到n编号的数字最开始每个都属于一个单独的集合,告诉你相邻的两个集合并且合并在一起,最终会合并为同一个集合,输出任意满足条件的原序列。并查集解法:使用两个并查集vl, vr分别记录当前集合的最左元素和最右元素,在合并时将记录最左元素的根节点接在左侧集合的根节点下,记录右侧的接在右侧根节点下即vr[ar] = br, vl[bl] = al,ar, br为两个集合的根节点。在拼...原创 2019-02-25 18:04:23 · 356 阅读 · 0 评论 -
牛客练习赛41 C 抓捕盗窃犯 并查集
题解把小偷行走的路线看作一个有向图,如果是一个环则整个环内任意选一个就可以得到整个环的收益。把每个环看作一个点,如果是一个链则选取链出度为0节点则可以得到整个链的收益。由于每个点出度至多唯一,使用并查集求出每个链的收益总和,选取前m大即可,注意m可能少于链的数量。AC代码#include <stdio.h>#include <bits/stdc++.h>#de...原创 2019-03-08 13:32:50 · 346 阅读 · 0 评论 -
L2-013 红色警报 并查集 逆向
题解题目要求在当前城市被攻陷之后,有些城市会导致无法连通时发出红色警报。逆向思考,可以将删除操作改为添加。如果添加当前点并且添加当前点连接的原有边后,导致原来两个不联通的部分连在一起则这个时候就是红色警报。这个连接操作并且检测是否有两个不同的联通分量合并在一起,可以使用并查集压缩路径O(1)完成。标记删除的点,逆向添加每个点,注意连接边时需要注意判断当前点是否存在。可以先和一个已存在的点...原创 2019-04-03 00:09:59 · 685 阅读 · 0 评论