最短路专项
A -BZOJ3706
显然可以发现有解当且仅当仅保留所有黑色边时,每个连通块存在欧拉回路
最小操作次数可以考虑将黑色连通块缩成一个点,然后在原图里一个连通块拿出任意一颗生成树都可以将这里面的黑点全部消掉(走到黑点的时候走欧拉回路,树边都只会经过两次且都是白边)。
显然不存在比这个更小的解,所以答案就是包含黑色边的连通块个数。
这个维护是简单的,可以通过并查集做到
B-「联合省选 2020 B」丁香之路
原题相当于是找一条欧拉通路包含所给边且起点终点分别是
注意到
通路比较麻烦,可以先连上
这时候问题又来了,现在变成了若干个存在欧拉回路的子图,每个子图大小不小于
将这些连通块看成一个点,变成欧拉回路的话,最优方案显然是原图中它们的最小生成树边权和的两倍(因为如果有
那就完了。
C-「AHOI2014」骑士游戏
显然建图
发现
处理一个dp :
这很经典,由于所有值非负,所以将
D-「BZOJ4070 Apio2015」雅加达的摩天楼
由于是由一只狗传递消息,所以不会出现两只狗互相跳来相遇的情况,也即任意时刻只会有一直狗在动。
一个比较暴力的转移是设
则当
注意到边权全是
阈值分治分析复杂度
E-「JOI 2020 Final」奥运公交
如果修改的边不在正反图的最短路径树上,则不会影响最短路,可以直接预处理四个状态的最短路直接拼起来。
否则重新跑一边算,这样的边仅有
F-「NOIP2017」逛公园
注意到
如果有零环且可能被经过则无穷。
先处理最短路,那么走边
所以设
转移很简单的,
G-「GXOI / GZOI2019」旅行者
直接跑多源最短路就好了,注意到可能自己回到自己,所以记录一个起点不同的次短路即可。
正解是二进制分组,这挺有启发,枚举每个 bit
位,将其
还有一个想法是正反图跑dijkstra并染色,所要求的最短路必然不会经过第三个特殊点,且两个特殊点之间的路径存在一个中边,枚举它,左右端点的最优解不同,直接算进答案,显然不会少算,也不会算到更优的非法解。
H-「COCI2017-2018#3」portal
直接暴力,要么按部就班地走,要么就可以花费到四个方向墙最短的距离走到四个方向任意一个墙的旁边,枚举转移即可。
I-「CEOI2014」The Wall
垃圾东西啊,这东西好像在哪里见过
首先可以发现所有点到左上角的最短路都会被最优方案围着,如果不是则用最短路替换掉显然不劣。
问题变成找一条回路包含所有的最短路径。
我们把路径画出来,将两个格子的十字交界拆为 4 个点,抄下图
(1)---(2)
| (0) |
(3)---(4)
1|2 (x-1,y) 1|2
---------------------------------
3|4 3|4
(x,y-1) | (x,y) | (x,y+1)
1|2 1|2
---------------------------------
3|4 (x+1,y) 3|4
然后一条边就被拆为了两条路,方便回路行走。
对于这样的虚点连边,不能够越过原先的最短路径,也不能够使用在村庄范围内的虚点,连边可以由这个图解释,注意左上角连边需要特判。
(1)-0-(2)---w---(1)-0-(2)
| | | 0
(3)-0-(4)---w---(3)-0-(4)
| | | |
w w w w
| | | |
(1)-0-(2)---w---(1)-0-(2)
0 0 0 0
(3)-0-(4)---w---(3)-0-(4)
跑这样的一个最短路就行了,它不会穿过任意最短路,也会包含所有村庄。
写起来是真的臭
J-「JOISC 2020 Day4」治疗计划
时间轴很麻烦啊,能不能统一?感觉相当抽象
考虑一个基本的DP,设
那么我们可以枚举
这个显然是对的,怎么优化啊
把状态当作点,是个最短路,起点应当是
按照
如何优化建图?
注意这些偏序都很简单,直接CDQ排序之后做前缀优化建图即可
K-「HNOI2009」最小圈
二分答案判负环即可。
L-「SCOI2011」糖果
比较蠢的差分约束题。
首先差分约束建图,然后 tarjan 缩点,直接拓扑排序即可。
如果一个SCC里面的边边权非零则非法。
M-CF1521D
树的最小剖分。
其实就是要断掉最少的边使得原树变为若干链。
那么可以转化为尽可能保留更多的边
那么一个点最多保留两条,且由于每条边保留贡献相同,能保留就保留。
所以直接贪心 dfs,如果当前可以合并两条链直接合,多出的链就不管了,否则如果有一条链就传给父亲解决。
这显然是对的。
N-arc121E
给定一颗有根树,要求有多少个排列
满足
你要求
问题得到转化,考虑容斥。
设
而
O-arc121F
容易发现 and 0 和 or 1 的话另一半什么情况是没有意义的
进一步感觉先 and 会比先 or 优秀一点
发现把 and 先弄完再弄 or 是最优的
然后不合法当且仅当每个 and 连通块都死了,容斥这一步,钦定每一个 and 连通块都存在零即可,那么只需要设 and
还是 or
就行了。
P-「COCI 2020.11」Svjetlo
先删掉全亮的子树。
显然每棵树最多会进去一次,最多会出来一次,那么路径端点就只能是有
而外部怎么走与树内部怎么走无关,你走出去了再走回来就可以省掉走出去的部分看成子树根节点走两次。
所以可以设
显然第三维是个背包的转移。前面的转移就相当恶心的分类讨论。
一个核心是往返一次会改变两个节点的状态。
对于
对于
对于
最后你可以选择当前点作为路径的一个端点来更新(注意可以是回路)。
Q-CF1442E
如果只有黑白点,那么显然是相连的同色点缩成一个点之后的直径长度
也可以看作同色点之间距离是0
然后加上灰色无非就是两色选一,设
答案显然是
R-CF512D
一个环显然无法操作,而对于一棵树而言就是一个拓扑序。
那么一个点如果属于某个环,这就是不动点。
如果一个连通块都是树,那么没有限制,只要满足某种拓扑序
否则把有环的连通块中可动点拿出来会组成一个森林,且有固定的根最后才能够删去(不可能有两个根,否则两个根路径上的点都是环上点)。
先考虑固定根的情况,直接就是拓扑序计数,跑一个背包即可。
对于一般树的情况,需要想办法去重。
不妨我们钦定根,且根不会被删除且是没有被删除的点里编号最小的,则编号小于根的所有子树是删完了的。
略微更改一下DP数组即可(即遇到钦定删完的就只保留删完的状态其余全部清空)。
最后各个部分的答案就直接卷积即可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战