图论
文章平均质量分 53
值得掌握的图论
可爱美少女
ccpc绵阳铜,icpc西安银,jscpc江苏金。
展开
-
2022上海-My University Is Better Than Yours-(缩点+拓扑)
就是说一共有n个大学,现在给你m种排名。现在定义x学校好于y学校,只要存在{s1, s2, …, sk} (k≥2)。s1=x, sk=y。看清题意,仔细思考,考虑所学的所有方法。原创 2022-10-12 22:25:18 · 380 阅读 · 0 评论 -
2016CCPCFinal-Pandaland-(无向图的最小环)
就是在一个二维平面上,给你m条边,每条边给你两个端点和一个边的权值。现在让你找出一个权值和最小的环。原创 2022-10-05 21:20:02 · 135 阅读 · 0 评论 -
洛谷-Directed Roads-(基环树总结)
就是给你一个n点n边的图,然后你可以让每条边定一个方向,使得这个图没有环。问你方案数同时取模。原创 2022-09-05 15:30:00 · 338 阅读 · 0 评论 -
ABC-Exactly K Steps-(树的直径+lca)
就是给你一个树,然后给你m次询问,每次让你输出一个与a距离为b的的点,如果多个输出任意一个,如果没有那么输出-1。多多思考,多画图看看,画图会让思维更明显,而且就算不对,也会一点一点推进,慢慢就把一些特殊情况考虑了。原创 2022-09-04 16:36:34 · 252 阅读 · 0 评论 -
洛谷-游走-(期望dp+拓扑)
P6154题意:就是给你一个n点m边的有向图无环图,可能存在重边,然后小A会随机选择一条路径,都是等概率的,路径的起点和终点可以相同。问你小A走的路径长度的期望,同时对998244353取模。思考:代码:总结:注意细节。...原创 2022-08-30 10:56:21 · 216 阅读 · 0 评论 -
牛客多校-Reviewer Assignment-(二分图匹配)
就是有n个人和m个文章。然后给你一个n*m的矩阵,如果为va[][j]==1代表第i个人可以阅读第j个文章。现在让你分配一种阅读方式,使得每篇文章被至少一个人阅读的越多越多,在此基础上被两个人阅读的越多越好,依次类推。如果有一个人没书读,那么就输出-1。考虑下题目的本质,能加优化的就加优化,有时候就可以过去。...原创 2022-08-28 20:33:33 · 144 阅读 · 0 评论 -
杭电多校-Darnassus-(最小生成树本质+预处理+链式向前星)
就是给你一个数组全排列,任意两点间的距离是abs(i-j)*abs(p[i]-p[j])。现在问你所有点联通起来的最小花费。原创 2022-08-13 16:04:52 · 315 阅读 · 0 评论 -
杭电多校-Counting Stickmen-(思维+组合数+容斥)
n,任选两个其实是选这个点以及他后面的,不能再看前面的了,这样就重复了,既然是看后面的,就维护一个后缀和倒着处理就好了),然后不能选a子树作为手臂的情况就是 = 总方案数-选a子树作为手臂的方案数。说到这里,我就感觉差不多了,就是这样的。然后思考了一下,如果我遍历树的时候,枚举到now点了,那么我可以让now当脖子,now父亲当头,然后从儿子里选取两个子树作为手臂再选一个子树作为身子就可以了。红色标注的就是的,就是2是头,3是脖子,5是身体,7和8是两个腿,4 6是其中一个手,9 10是另一个手。.....原创 2022-08-09 15:21:05 · 451 阅读 · 0 评论 -
杭电多校-Planar graph-(最大生成树+图树关系)
因为要让答案的边最少字典序最小,那么生成树就应该是最大的生成树。既然字典序最小,那么就让编号从大到小排序,尽量让编号大的留下,这样剩下的就是小的。3.然后又突然想到,并查集也经常和环挂边,然后我就想到如果两个点已经联通了,加上这条边肯定是环,所以不要这条边就好了。题目又说,让字典序最大,那么删的时候就要确定是删这个,要不然就不好想了。然后也想了想生成树,但是每个边左右的区域不好编号呀,感觉这怎么求最小生成树呢?2.过了一会zc说就不能有环,那么确实很明显这个图不能有环,就去删边去掉环就行,但是怎么去掉?..原创 2022-08-05 19:51:26 · 198 阅读 · 0 评论 -
杭电多校-Slipper-(树图转化+虚点建图)
当时我虚点建边的时候建立错了,傻逼了,就跑的很慢。2.那么既然感觉树上dp不能做,还求A到B的最短距离,这不就可以建图然后跑最短路。到这里其实就简单了,建图就是建立可以跳跃的哪些点之间要建好图。那么可以先把每个深度的点维护出来,那么深度为a的到深度为a+k的进行建边,如果暴力枚举点点建边这是n。然后小A可以使用任意次魔法,使用一次魔法可以使得深度差为k的两个点可以互相传送,花费为m。感觉应该是个难题,但是后来过的很多,那么就不是难题了。其实可以建立一个虚点,然后a的点集连虚点,右边的点集连虚点。......原创 2022-08-03 14:29:23 · 174 阅读 · 2 评论 -
CFdiv2-The Number of Imposters-(两种点集图上染色问题总结)
D题意:就是给你n个人,和m句话。每句话是a说b是好人或者坏人。问你这些人中最多有多少坏人。当然如果这m句话有错误出现驳论那么就输出-1。思考:1.这是很久之前做的题了。有两种做法,种类并查集和两种点集图上染色。这里就整理第二种做法。首先,这些人可以很明显的去合并和分类,意思就是,a说b是好人,那么a和b就在一类,如果不是好人,那么就不在一类。2.那么可以对a和b建边,权值为1的时候代表a和b是一类,权值为0的时候代表a和b不是一类。建立完边后呢?那么一个连通块的人,只要确定了一个人的身份,剩下的身份原创 2022-08-01 21:58:54 · 213 阅读 · 0 评论 -
牛客多校-Journey-(建图distra+卡常优化)
其实这题,给你的路口,也没给你指定的方向,只是逆序的给你。所以要按边跑,也就是把边看成点,把这些边看成不同的点,进行hash。建图的时候就是枚举一个路口的四个路口,然后找出两个路口,对他们建图,如果是右转那么不花费。就是给你n个十字路口,每个路口有四个方向,按逆时针给你路口的标号,如果是0标号代表没有路口。然后你每次在路口进行右转是不花费的,然后前进,左转,倒头,都是花费1。先在你在A路口对着B路口的路上,让你走到在C路口对着D路口的路上。你面对的方向是不用的,A对B和B对A是不一样的。...原创 2022-07-26 16:24:19 · 169 阅读 · 0 评论 -
CFdiv3-Passable Paths-(思维+lca)
G题意:就是给你一个数,然后给你m次查询,每次查询给你一些点,然后问你这些点是否在一条链上。思考:看到这题,画了画图模拟了一下,发现对于一个点,如果这个点的所有儿子所代表的子树中有集合中的点,如果>=3个儿子有就不行。因为这就分叉了,没法走一条链。所以直接dfs到now点,看看儿子所在的子树中有几个是有集合点,同时看看他自己父亲节点上面有没有。判断一下即可。这样的复杂度是q*O(n)的。由于easy版本只查询5次所以可以。对于hard版本,查询1e5次。那么必须要O(n)的,刚开始想了下预处理?但是点原创 2022-07-11 15:17:11 · 301 阅读 · 0 评论 -
CFdiv3-Split Into Two Sets-(二分图或并查集)
E题意:就是给你n个牌,每个牌上有两个不超过n的数组,现在问你是否可以吧n个牌分成两组,每组中的所有数字都不一样。思考:刚开始看的时候感觉直接暴力就可以,实际上卡死。当然发现每个数如果出现次数>=3肯定也是不行的。然后并查集就是如果a和b在一个卡牌上,那么他们在一个集合里面,看看某个集合里面有多少数,如果是奇数个数字,那么肯定某个数在这里面出现了两次,但是只算了一次,因为一个集合里面必须是偶数个数字。所以最后判断一下就可以了。对于二分图,刚开始我想二分图的话,是想把每个卡牌看成点,但是这样根本无法建图原创 2022-07-11 14:52:03 · 514 阅读 · 0 评论 -
CFdiv1+2-Potion Brewing Class-(树上乘除+因子)
D题意:就是给你n个物品,然后给你n-1个关系,就是a:b = c:d,也就是a物品和b物品的比值就是c:d。然后每个物品真正的值都是正整数,现在问你这些物品的总和最小为多少。思考:当时看到这题感觉肯定和最大公倍数有关。然后想了想咋根据比例处理出最小的总和,想了想是不是并查集呢。看了下样例发现整个图都是联通的,并查集没用了。由于感觉题目比较难,就没仔细看,实际上给你了n-1个关系,很明显在告诉你是一个树。那么既然是个树,各个关系比例还给你了,如果你把第一个点的值就确定为1,然后剩下所有点的值都出来了,当原创 2022-07-08 14:25:55 · 184 阅读 · 0 评论 -
CFdiv1+2-Equal Tree Sums-(感性思考+染色)
E题意:就是给你一个树,然后让你给每个点一个权值。要保证,对于删掉任意一个点,剩下的所有自联通块的权值和都必须一样。思考:对于删掉一个点,子树权值还一样。刚开始我以为删掉一个点后就剩两个子树,实际上可以剩很多子树,看这个点的度为多少,子树就有多少。然后到底该怎么办呢,感觉和度数有关,要不然凭空构造一个树那么复杂肯定很难构造。其实就是从任意一点开始搜,每个点的权值就是度数,有的为负有的为正,对图进行二染色,一种颜色都是正的,一种颜色都是负的。这样整个图下来,每个度会有两个点,每个点一正一负正好权值和为0。原创 2022-07-07 11:57:26 · 88 阅读 · 0 评论 -
ABC-Teleporter Setting-(思维+最短路)
F题意:就是给你一个图,然后给你边的时候,有可能其中一个点是0,也就是代表这个点是可以变动的。然后对于所有可变动的点,分别让他们为1到n。问每次1到n的最短路是多少。思考:刚开始我就想,那些点可以变,如果每次求最短路肯定超时。肯定从1和n分别跑一次最短路,然后再去枚举那些可能会变动的点,距离就是dist1[i]+dist2[j]啥的,但是这样不行,因为有很多点是不确定的,你这样不能保证最短。但是感觉又没啥别的方法可以做了。实际上,还是脑子傻逼了,其实对于那些不确定的点,你就把他当成一个超级源点就行,然后原创 2022-06-26 20:09:01 · 180 阅读 · 0 评论 -
2020蓝桥杯国赛B组-补给-(状态压缩+floyd)
补给题意:就是有n个村庄,每个村庄有个坐标,然后1号村庄是基地,直升机一次走的最大路程是m,然后每到一个村庄可以加满油,现在问你把每个村庄都走过,一个村庄可以走多次,然后最后回到基地1号村庄,问你最短的距离是多少。思考:刚开始我一看这种往下走还要回到根节点的这不和之前做的龙龙送外卖一样嘛,再一看这个题目不是树,是图,并且点最多20个,那么很明显了,状态压缩,对于说的每个点可以走多次,那么可以先跑floyd,然后再去状态转移一遍即可。要注意的是最后要求要回到1号点,对于dp[(1ll...原创 2022-06-16 16:13:53 · 312 阅读 · 0 评论 -
2020秦皇岛-Friendly Group-(思维+set删点+并查集)
F题意:就是有n个人,然后有m对朋友关系,现在让你选出一些朋友进入派对。这个派对的友好值就是,朋友关系-点的个数,也就是边的个数减去点的个数,问你友好值最大是多少。思考:其实看到这个题就感觉和我之前做过的一道题很像,就是对于一个点如果入度为1就没有存在的意义所以就去删去,然后再把入度为1的放进set里,直到没有入读为1的点。然后还有一种思路,就是直接并查集合并,如果这个集合的边>点就拿这个集合,否则不拿,就行了,当时也没去这样想,仔细想一下确实是这样…挺简单的。代码:set删点#inc原创 2022-05-08 16:32:07 · 401 阅读 · 0 评论 -
2022蓝桥杯省赛A组-青蛙过河-(二分+并查集记录路径)
E题意:就是小青蛙在0点,学校在n点,然后1到n-1个地方有石头,而且有个高度,小青蛙每跳一次这个石头会降低一格,如果<=0不能再去跳了。问你小青蛙跳跃距离最小可以多少满足他x次上学,x次上学分别是去x次,来x次,一共2*x次过河。思考:刚看到这题,这去x次来x次,这怎么贪心呢,如果每次尽量往远的跳肯定不行,这样来的时候可能就没机会了。实际上你转化一下,去x来x,为何不能转化成去2x次呢?这样就能每次贪心跳最远的点了。为什么能这样转化,因为你怎么去,我就怎么回来,所以和去x次一摸一样。现在就好原创 2022-05-06 16:26:22 · 1218 阅读 · 1 评论 -
2022蓝桥杯省赛A组-推导部分和-(bfs维护前缀和+并查集)
J题意:就是有一个数组,然后给你m个一段区间的和,然后再给你k次询问,每次查询l到r的区间和是多少,如果无法确定就输出UNKNOWN。思考:其实看到之后我是没有什么思路的,感觉像带权并查集,但是好久没用过,掌握的太差。又感觉像差分约束,但是差分约束也是处理不等关系的呀,然后没想法了。其实这个题就是按差分约束去建边,a-1到b,b到a-1,然后这个图肯定是不同的连通块,对于每个连通块随便找个初始点去bfs,把其他的点的前缀和都处理出来,因为查询的时候要的也是差值,所以只要维护出前缀和就行了。到此题目就原创 2022-05-06 14:23:48 · 1028 阅读 · 1 评论 -
2021江苏省赛-Anti-merge-(思维转化+二分图)
J题意:刚开始这个题意就很难懂,就是给你n*m的格子,每个格子有个编号,如果两个相同的编号相邻那么他们就会合并,除非你对其中一个进行颜色标记。现在问你最少用多少种颜色可以不让原本的格子合并,在用这些颜色的前提下最少要颜色多少次。思考:刚开始我感觉就是先找出来最少的颜色数,然后再用这些颜色去二分最少次数,但是没法check,然后就僵住了。过了会周来了句应该就是用1种颜色染就行了,然后恍然大悟,之后我以为就是没有上司的舞会,最少的颜色次数嘛,但是这个图是可能有环的然后就不行了,之后于说就对这个图染色,奥原创 2022-05-05 13:41:09 · 497 阅读 · 0 评论 -
2021桂林-Tax-(spfa+dfs路径)
K题意:就是给你n点m个边,每条边被其中一个公司管理,现在你从一号点开始出发,对于到达任意一点有很多条路径,你会选择最短的路径,同时对于多个最短的路径选花费最少的那个。对于花费的计算就是,你走的这条路径,每条边走过的次数✖这条边属于那个公司的权值。思考:对于从1到任一点的最短路很明显,就是一遍spfa就行了。但是对于到某一点如何确定权值最小的怎么找呢。其实看到数据范围n为50,就可以发现,可以直接爆搜,但是要注意,只有dist[spot]==dist[now]+1的时候,才可以过去,为什么呢,既然是原创 2022-04-11 09:21:08 · 167 阅读 · 0 评论 -
2021桂林-Buy and Delete-(思维+distra求有向图最小环)
E题意:就是给你n个点m条边,然后每条边有一个价值,小A现在又c元钱,他可以买一些边,然后放进图中。然后小B每次可以删去一些边,这些边不能构成环。小A想让小B删的次数尽量多,小B会删边次数尽量少,问你小B最终会删多少边。思考:真的绝绝子啊这题,害,当时和于讨论出题意之后,立马想到了一个想法答案就是环的数量+1,为什么这样想呢,因为我想着每次对每条环删去一条边,然后剩下的图不能构成环了再一次删掉。现在就变成了找环的题目,我一看是有向图,可以直接缩点,按所有环的大小排序看看小A最多能拿多少环。实际上题原创 2022-04-10 20:38:08 · 405 阅读 · 0 评论 -
2018深圳-Balance of the Force-(思维+二分图+孪生问题)
B题意:就是给你n个人,然后每个点有两个权值,然后有两个阵营,每个人可以进黎明阵营那么权值就是第一个,进黑暗阵营权值就是第二个。还有m个条件就是a和b不能在一个阵营。然后问你所有人分配好之后,最大的权值减去最小的权值最小为多少,如果非法输出impossible。思考:对于非法很明显就是有奇数环。然后就是分配阵营了,如何分配对吧,对于给的m条边,可以发现每个连通块的状态只有两种,一旦一个人的阵营确定的,剩下的人全部确定。对于每个连通块都有两种状态可言,对于状态我们只要最大值和最小值,因为只有最大值和最原创 2022-04-06 16:23:12 · 298 阅读 · 0 评论 -
ABC-Bishop2-(bfs和distra的区别)
E题意:就是给你一个矩阵,有的能走有的不行,现在问你从起点走到终点的最少次数。每次可以往四个角走,可以走任意距离。思考:一看能走任意距离就是洪流的那道题,但是刚开始我想傻逼了,在想中间如果有#怎么判,其实第一次遇到#就可以break了。然后我就写了,我想着走的方向都是不一样的,反正能进来就进来就行了,然后第一次遇到终点就return距离,就错了。因为我用的是一次一次走的,不是枚举多少,所以queue里面不满足单调性了,如果用洪流的话,第一次进来的肯定是最好的,所以同方向的时候不会被更新第二次。但是我原创 2022-04-03 13:49:07 · 683 阅读 · 2 评论 -
2018南京- Magic Potion-(思维+二分图最大匹配)
I题意:就是有n个英雄,m个怪物,k瓶药水,每个英雄可以杀死一个怪物,但是如果喝了药水可以多杀死一个。现在呢又给你每个英雄可以打死哪些怪物。问你最多可以杀死多少怪物。思考:刚开始看到范围不大500,然后每个人可以杀死某些,给你了特定的怪物。我感觉就像二分图。对然后直接跑最大匹配就行了,但是第一次是先跑最大匹配,然后从剩下的怪物再跑一次,同时对答案最k去min。但是发现不对?因为什么把,第一次你跑最大匹配的时候,用的a怪物,但是不如用b怪物更好,因为下次还要用药水。所以就换了个写法,直接一遍最大匹配,原创 2022-04-01 16:01:58 · 169 阅读 · 0 评论 -
牛客练习赛92-D与S-(思维+bfs)
D题意:就是给n个点,m条边,然后小牛刚开始在1号点,每一秒大牛可以把小牛所在点的临边减去一个。其中有些是关键点,问你小牛是否能达到关键点。思考:用手稍微模拟了一下,发现一个点的临点中如果有两个关键点,那么就可以成为关键点。然后开始树上dfs。写这边的题解的主要目的是把自己看图都是树的习惯给打破掉,人家又没说是树,所以就按图来就行了。所以这题直接bfs就行,把关键点放进来去更新别人。代码:int T,n,m,k;int va[N];int vis[N];int can[N];vecto原创 2022-03-29 17:00:07 · 214 阅读 · 0 评论 -
牛客练习赛93-牛牛选路径-(思维+欧拉图)
E题意:就是给你n个点和m条边,每个点有个权值,每次可以选择一个起点和终点然后这条路径和可以重复覆盖某些边,使得每条边被覆盖奇数次,使得这些路径权值和最小。权值就是起点和终点的权值之积。思考:刚开始发现好像不是那么好做,但是感觉这种题就是读懂题之后的一种贪心模型罢了。其实说,让每个边经过的次数都是奇数,如果直接乱弄肯定没法做,其实可以想象一下,如果没有度为奇数的点,那么肯定有一个欧拉路,所以直接从i点走到i点就行了。如果有奇数点呢,那么肯定有偶数个,因为度 = 2*边,度是偶数。所以奇数是成对出现的原创 2022-03-29 13:34:59 · 197 阅读 · 0 评论 -
牛客练习赛93-点权-(树上distra+本质理解)
C题意:就是给你一个n个点的树,n-1条边。刚开始每个点的权值都是0,然后一个点如果度<2那么可以直接从0变为2,不需要花费。还可以让一个点权为2的变成-1,然后让他的其中一个邻接点的权值+1,花费就是边权。思考:其实看到感觉说的很复杂,这种题就是一种什么模型,看懂就行了。就是度<=2的可以直接变,其余的点都需要从2个点来合成,所以刚开始我写了个dfs,但是发现也可以从父亲转移,所以加了个get但是这样肯定不对把,就像模拟一样。然后发现这不就是一个图吗,直接从叶子节点去跑也行呀,我想着就原创 2022-03-28 22:16:32 · 274 阅读 · 0 评论 -
ABC-Endless Walk-(缩点+拓扑dp)
F题意:就是给你一个有向图,没有自环和重边,现在定义一个点如果可以从这里出发然后无穷尽的走下去,那么就是好点,问你有多少好点。思考:所谓的好点就是可以走到环里面去,所以就是找环了,如果染色找的话不太好操作,发现这里是有向图,又是环,很快想到了缩点,把环缩一块,然后哪些可以走到这些缩点的也是好点,那么现在就是如何把所有的好点找出来。先判断有环的缩点,就是这个缩点的个数>=2,所以再建立一次边,跑一次反向dp,也就是当前如果为好点,那么他走到的点也是号点,即可。代码:int T,n,m,k;原创 2022-03-26 22:11:41 · 590 阅读 · 0 评论 -
PTA-最小生成树的唯一性-(最小生成树的边权地位)
最小生成树的唯一性题意:就是给你n点个m条边,问你是否能这个图的最小生成树是唯一的,如果唯一输出最小生成树的权值,不唯一输出一共有多少连通块。思考:其实乍一看判断最小生成树是否唯一感觉像是见过,但是怎么也想不到,那就是没做过,只是见过罢了。然后我就想,是否唯一该怎么判断呢,之前做过两道都是用最小生树相同边权的地位都是相同的性质,我感觉如果在合并之前有res个边需要用,但是到了合并的时候只有res_t个了,也就是某些边可以用可以不用,只要出现这种情况那么这个最小生成树就不是唯一的。其余的操作就很简单了原创 2022-03-24 11:09:17 · 886 阅读 · 2 评论 -
2017南宁-The Maximum Unreachable Node Set-(二分图+最小重复路径覆盖)
The Maximum Unreachable Node Set。题意:就是给你一个有向无环图,现在让你求出一个最大的点集,使得任意两点之间不能相互到达。思考:乍一看感觉像是求最大独立集,但是其实不是的,你发现答案不对。因为这是有向图,而不是二分图,所以你要建立二分图。但是建立完之后图就和原题给的图不一样了,你再求最大独立集是不对的,你已经吧题意给转化了。其实这里,求谁也不能到达谁,由于路径可以重复走,所以先求出来最大匹配,剩下的就是互不可达的。那也就是最小重复路径覆盖。代码:int T,n,m原创 2022-03-16 10:28:03 · 151 阅读 · 0 评论 -
二分图总结
1.二分图判定:一个二分图就是两个点集,也就是不能含有奇数环。例题:图的遍历。2.最大匹配:可以建立单向边,直接n次dfs,求出最大匹配即可。例题:飞行员。建立双向边,n次dfs,求出最大匹配除以2即可。例题:Cat VS Dog。3.最大独立集:求出最大的集合,里面的任意两点间没有边。最大独立集 = n-最大匹配。例题:Cat VS Dog。4.最小点覆盖:就是用最少的点,把每条边都覆盖掉。最小点覆盖 = 最大匹配。例题:机器任务。5.最小边覆盖:就是用最少的边,把每个点都覆盖掉。原创 2022-03-15 14:14:57 · 583 阅读 · 1 评论 -
洛谷-Tree and Queries-(树上启发式+树状数组)
DIV1-D题意:就是给你一个树,然后每个节点有一个颜色。给你m次询问,每次问你以a点的子树中,出现次数>=k的颜色有多少种。思考:不管别的,先考虑一下,怎么快速查询>=k的颜色有多少种。这是以前我遇到过的问题,一个数组,每次可以让一个点加1,一个点减1,最后问你整个数组元素>0的个数。其实,可以这样做,不直接去维护。而是先用一个数组,看看这个颜色出现了多少次,树状数组维护这个次数就行了。但是,对于刚才提的问题,如果出现负值就不行了,因为不能维护负值。然后呢,对于comb也就是合并原创 2022-03-13 12:10:07 · 267 阅读 · 4 评论 -
ABC-Edge Deletion-(floyd+理解)
E题意:就是给你一个图,不过点只有300个,然后问你最多能删掉多少边,可以使得这个图任意两点的最短路不发生改变。思考:以前那种cf上删边加边的题都是特别难的,感觉没法做。其实这个题,300的范围已经提示你在用floyd了,不要想那么复杂,既然要保证最短路不发生改变,那么就看看,跑完一遍floyd之后,哪些边权还不如当前最短路短的肯定是可以删掉的,但是又想如果删了这个边,但是别人用怎么办?其实怎么可能呢,a和b之间有更短的路径,不会再用a和b之间的那条边了,所以可以删掉。还有一种就是如果最短路没变的话原创 2022-03-13 10:26:29 · 713 阅读 · 0 评论 -
洛谷-Blood Cousins-(树上启发式合并+倍增)
DIV2-E题意:就是给你一个家族树,不一定就一个树,可能是森林。然后如果a是b的父亲节点,那么a就是b的一级祖先,依次就是k级祖先。如果两个点共同有k级祖先,那么他们就是k级表亲。现在给你m个询问,问你和a点为k级表亲的点有多少个。思考:刚开始看到,这不是子树问题啊,这是找相邻的兄弟问题啊。但是你想想,既然是共同k级祖先,那么直接找到a点的k级祖先,然后以这个点的子树,看看有多少深度为dep[now]+k的,个数-1就是和a是表亲关系的,对吧。其实转化一下,思路就很明显了。剩下的就是基本操作了。值原创 2022-03-12 21:17:01 · 177 阅读 · 0 评论 -
洛谷-Blood Cousins Return-(树上启发式合并+set)
DIV2-E题意:就是给你一个森林,然后每个节点有一个名字,然后让你输出每个节点代表的子树内,且深度是该节点+k的节点的名字不同的有多少个。思考:很明显了,离线查询每个子树,一般就是启发式。这个题呢,说的是森林其实也一样,每个根节点都跑一遍就行了。对于某个深度有多少名字,直接维护n个深度,把名字放在set里就行了。代码:int T,n,m,k;string va[N];int dep[N],siz[N],son[N];int anw[N];set<string > s[N]原创 2022-03-12 19:24:02 · 282 阅读 · 0 评论 -
Virtual judge-Treediff-(树上启发式合并+map)
Treediff 题意:就是给你一个树,然后最后m个数是叶子节点,并且有值。现在问你在前n-m个点所代表的子树中,每个数可以得到的最小差值。最小插值就是他的所有叶子节点中任意两个绝对值差最小是多少。思考:很明显的树上离线查询,就是启发式合并了呀。这里怎么维护绝对值之差最大最小呢。比如我加入一个数字,如果这个数字出现的次数>=2那么minn=0,否则的话,找到第一个比他大和第一个比他小的更新一下即可。这里同时体现了对于map或者set的下标使用。代码:int T,n,m,k;int min原创 2022-03-12 17:02:01 · 292 阅读 · 0 评论 -
洛谷-Tree Requests-(树上启发式合并+维护深度和字母)
DIV2-D题意:就是给你一个树,然后每个节点有一个字母,给你m次查询,每次问你以a为根的子树里面深度为b的所有节点的字母重新排列后能否组成一个回文串。思考:很明显了,离线处理子树问题,对于重新排列后能否形成一个回文串,意思就是对于每个字母看看出现的次数为奇数的有几个,最多1个,要不然就组成不了。所以这个里面维护cnt[i][j]代表深度为i字母为j出现的次数。这个就是维护cnt数组就行了,也用不到别的全局变量之类的。代码:int T,n,m,k;int va[N];int dep[N],s原创 2022-03-12 12:23:49 · 246 阅读 · 0 评论