NOIP2024集训Day44-45 图论
NOIP2024集训Day44-45 图论
A. [BZOJ3706] 反色刷
欧拉回路,易于发现有解的充要条件是没有奇点。
我们需要注意到,白边不一定不走,只要走偶数次就可以。
所以我们可以将白边堪称两条黑边,这样对每个点的奇偶性是没有影响的,而且同样是求欧拉回路。
用并查集先维护出连通块之后,只需要记录一下每个连通块是否有黑边,如果有黑边就要刷一次,没有就不要。无解同样用奇偶性判断。
B. [省选联考2020 B卷] 丁香之路
很经典的模型(但是我不会),首先起点和终点连一条边,然后考虑加最少的边使得有欧拉回路。
欧拉回路有两个条件,度数都是偶数很好满足,直接把相邻的奇点连边肯定最优,但还需要满足连通的条件。
考虑到图上边权的特殊性,我们显然只需要使用形如 \(i\sim i + 1\) 的边,而这些边没有必要替代之前新加的边。所以直接拿这些边跑剩下连通块的最短路就好了。
时间复杂度 \(\Theta(m + n^2 \log n)\)。
C. [AHOI2014] 骑士游戏
SPFA 处理有后效性 dp。
设 \(f_i\) 表示杀死 \(i\) 号怪物的最小花费,则 \(f_i = \min(k_i, s_i + \sum f_j)\),其中 \(j\) 为 \(i\) 用物理攻击后可以分裂为的怪物。
直接 dp 存在后效性,所以我们用 SPFA 来跑这个 dp。
每更新一个点 A 的 dp 值,就会有若干个点的 dp 值可能被更新,即可以分裂出点 A 的那些点。所以 A 出队后一旦 dp 值被更新,就把那些点入队。
初始时把所有点入队。
D. [APIO2015] 雅加达的摩天楼
分块思想 + SPFA + 建图优化。
看到题目第一眼肯定会想到最短路,但最坏情况有 \(n^2\) 条边,显然任何一种最短路算法都不能过。
所以我们考虑用分块的思想来优化建图。
- \(P_i\gt \sqrt{n}\),暴力加入每一条边,每次最多 \(\sqrt{n}\) 条边。
- \(P_i\lt \sqrt{n}\),对于每个点添加 \(\sqrt{n}\) 个辅助点,这里可以理解成一栋楼有许多层,每一层一步能走的范围都不同,然后每一层分别连边,每一层到楼底连边。对于一只 doge,从楼底到 \(P_i\) 对应的楼层连边。边数是 \(\Theta (n\sqrt{n})\) 的。
综上,总边数和总点数都是 \(\Theta (n\sqrt{n})\)。
E. [JOI2020 Final] 奥运公交
直接跑最短路,然后考虑翻转每一条边后怎么快速地计算代价。
显然如果这条边不在 \(1\rightarrow n\) 或者 \(n \rightarrow 1\) 的最短路上,直接考虑强行走过这条边的最短路就行了,可以通过记录最短路和次短路(要求前去不同的最短路)来实现。
否则,这样的边只有 \(\Theta(n)\) 条,直接重新跑 Dijkstra 即可。
F. [NOIP2017 提高组] 逛公园
首先肯定要求最短路,然后就变成 dp 了。
令 \(f_{i, j}\) 表示到点 \(i\) 比 \(dis_i\) 大 \(j\) 的路径条数,于是有:\(f_{i, j} = \sum f_{k, dis_i - dis_k + j - d_{i, k}}\)。
然后记搜就完了。
解释一下 \(dis_i - dis_k + j - d_{i, k}\) 的来历:
\(x + dis_k + d_{i, k} - dis_i = j\),其中 \(x\) 表示如果到点 \(i\) 比 \(dis_i\) 大 \(j\),那么到点 \(k\) 应该比 \(dis_k\) 大多少。
对于判断 \(0\) 环,就开个数组记录一下 \(f_{i, j}\) 是否已经存在,存在就直接跳过。
M. [CF1521D] Nastia Plays with a Tree
看了官解。
有一种贪心的构造法。如果一个点,有至少两个儿子节点,就不用让它与父节点连边,它的父节点就可以去连接别的儿子,而对于这一步来说,丢失的边数量都是 \(deg - 2\)。
那么做法就很简单了:如果只有一个子节点,接上去;否则断掉它与父节点的连边,并且任选两个子节点上去。

浙公网安备 33010602011771号