3 月图论讲课专题题目

ARC092F Two Faced Edges
题目大意
- 有一个
个点 条边的有向图。保证图中不存在重边和自环。 - 试判断将每条边反向,其他边不变的情况下,图中强连通分量的数量是否改变。
- 若改变,输出
diff
,否则输出same
。 , 。
解答
因为
因为关心的是强连通分量的数量,所以对于边
- 是否有从
到 的路径。 - 是否有不经过
的单向边的从 到 的路径。
然后分类讨论:若两个条件都满足,反向后
若满足条件 1 而不满足条件 2,那么反向前,
那么如何快速判断这两个条件是否满足?条件 1 是好判的,DFS 加邻接矩阵。那么对于条件 2,我们枚举每一个点
P4630 铁人两项
题目大意
给定一个无向图,求有多少个符合条件的点对
解答
那么我们就将原图转化为一棵圆方树。具体的,圆方树上面分为两种点:圆点和方点。圆点就是原图上所有的点,方点则是一种虚点,每一个点双连通分量都连接着一个方点。
那么,我们就可以在求点双的同时把圆方树建出来。然后就变成了一个树上问题。对于原图中的每一个点,我们就要求:有多少条路径经过了这个点?
于是乎,对于圆方树问题,有一个常用 trick:给每一个点赋上特定的点权,然后再去做树上问题。那么这道题,就可以将圆点点权赋为
然后就在树上统计有多少条两端点为圆点的路径经过了这个点(注意
P1967 货车运输
题目大意
A 国有
现在有
解答
一道 Kruskal 重构树的模板题。
Q:Kruskal 重构树是什么?
Kruskal 重构树是一个可以维护两点在最小生成树上的最大边权的树。可以在 Kruskal 算法建最小生成树的同时构建。
具体的,在使用 Kruskal 算法建最小生成树,是可以通过并查集实现的。我们对于每一个连通块记录这个连通块代表的节点。最开始设置其为
,和 一样。当合并两个连通块时,我们就对于这两个连通块,新开一个节点,将这个点点权赋值为这条边边权。然后将这个新点和原来的两个连通块连边。最后将这个新连通块的代表的节点设为这个新点。 这样,就会得到有
个实点、 个虚点的一棵树。欲求两个点在最小生成树的最大边权,那么求这两个点在树上 LCA 的点权即可。 最大生成树的最小边权同理。
这道题就是让我们求最大生成树的额最小边权。按照上面的方法构造即可。
P9352 训猫
题目大意
有
一开始,一只猫待在高度为
接下来对这只猫进行锻炼。在锻炼中,我们每次选择一个架子并在其上放置障碍物。但是,我们不能在已经放置障碍物的架子上再放置障碍物。在此过程中,会发生以下情况。
- 如果猫不待在选定的架子中,则什么也不会发生。
- 如果猫待在选定的架子中,并且与选定架子相邻的每个架子上都有障碍物,则锻炼结束。
- 否则,猫将沿最短路径前往,仅通过移动到相邻的架子且不经过放置过障碍物的架子,能到达的所有架子中,高度最高的那个。
给定每个架子的高度和架子彼此相邻的方式,编写一个程序,计算如果我们适当放置障碍物,猫最多需要移动多少次。从一个架子移动到相邻的架子被称为一次移动。
解答
其实,这只猫的路线是可以被固定的。因为你可以在你要选的那条路线的旁边都放上障碍。
但是有一个限制:就是说你选的路线
然后就开始树上转移:按照高度从小到大遍历所有的点:设现在遍历的点为
枚举
我们设
AT_cf17_final_j Tree MST
题目大意
给定一棵
求完全图的最小生成树的边权和。
解答
这道题需要用到 Boruvka 算法求最小生成树的相关知识。
Q:如何使用 Boruvka 算法求最小生成树?
首先,我们将原图分为
个连通块。每一个点为一个连通块。 然后,对于每一个连通块,我们找一条一个端点在该连通块内,另一个端点在该连通块外,并且边权最小的一条边。所有连通块找完了之后就通过这一条边合并两个连通块。
一直执行这个操作直到最后只剩下一个连通块。这个连通块就是原图的一种最小生成树。这种算法在求边很多的稠密图的最小生成树时非常有用。因为最多只会执行
轮操作(每一轮操作都会使最小连通块的 为它原来的两倍)。
然后,对于这道题,我们也可以使用 Boruvka 算法的类似思想。对于两棵子树合并成的一棵树,我们可以先找一个点 DFS 一遍(DFS 的同时赋
然后对于这两棵树,我们就可以再递归下去……就变成了一个经典的点分治问题。每次 DFS 的起始点其实就是这棵树的重心。然后就得到了
ARC084B/ABC077D Small Multiple
题目大意
给定一个整数
解答
这道题可以跑同余最短路。因为我们要求
我们就定节点
操作,将点 和点 连一条有向边,边权(代价)为 。 操作,将点 和点 连一条有向边,边权(代价)为 。
这种有可能会出现一些不优的情况,但是最优的情况一定是存在的。而因为求的是最优,所以这样建图是合法的。
最后,因为是
P7669 月票购买
题目大意
JOI 君住在一个有
JOI 君住在
JOI 君经常去
当他从
日元:如果铁路 包含在他购买的通勤票时选择的路线中,或者, 日元:如果铁路 不包含在他购买通勤票时选择的路线中。
上述票价的总和就是从
他想知道如果他在购买通勤票时选择合适的路线,从
解答
可以发现,这个人走的路线一定是先走一段需要花钱的路,然后再走一段免费的路,最后再走一段花钱的路。中间的路不可能为 2 段。因为选代价为
那么我们就可以建分层图,第一层和第三层为原图,第二层暂定为免费的路线。那么现在要求的就是哪些路线是
对于每一个边
但是现在有一个问题,现在求出了最短路有哪些边了,但是可能会有这个人走最短路走到了一个点,但是又沿着另外一条路线往回走的情况。由题意看出这个是不合法的,所以要把中间的第二层拆为两层,记其为 2·1 和 2·2 层。层 2·1 存单向边,存哪一些边在
最后将第一层的点和第 2·1 层、第 2·2 层的点连单向边,代价为
P9351 迷宫
题目大意
给定一张 .
可以走,而 #
不能走。一次操作可以将 .
,给定起点和终点,求最少需要几次操作使得起点和终点连通(只能上下左右移动)。
解答
假设现在某个地方。那么可以花费
而假设现在旁边有一个黑点,那么可以花费
那么就可以使用 01 BFS 来解决这道题。
Q:什么是 01 BFS?
01 BFS 是一种解决边权只有 0 和 1 的最短路问题的方法。这种的复杂度只有
。点数级别。非常爽。 我们使用一个双端队列,然后每次从前取出。若接下来的边权为
,那么就将其更新后, push_back
进队列。若接下来的边权为,那么就将其更新后, push_front
进队列。这样做是正确的,因为你取的是现在最优的
,若边权为 ,那么依然为现在最优,继续使用。否则就不优, push_back
。并且的单调性也是显然的。
P3231 消毒
题目大意
最近在生物实验室工作的小 T 遇到了大麻烦。 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为
而由于严格的实验要求,他被要求使用一种特定的 F 试剂来进行消毒。 这种 F 试剂特别奇怪,每次对尺寸为
现在请你告诉他,最少要用多少单位的 F 试剂。
解答
根据 F 试剂的消毒原理,最优的选法肯定是
首先先不分析 3 维,先分析 2 维。
二维的情况相当于是,假设这里有一个点
那么现在问题就转化为:选一些点,让每一条边都至少有一个点被选。这就是二分图最小点覆盖问题。
根据 Konig 定理,二分图最小点覆盖等于二分图最大匹配。
现在跳到 3 维。由于是没有三分图最小点覆盖的这种东西的,所以我们要尽可能地将其转化为 2 维问题。
看数据范围,
P3825 游戏
题目大意
小 L 计划进行
小 L 的赛车有三辆,分别用大写字母
其中,赛车
适合所有赛车参加的地图并不多见,最多只会有
小 L 对游戏有一些特殊的要求,这些要求可以用四元组
你能帮小 L 选择每场游戏使用的赛车吗?如果有多种方案,输出任意一种方案。
如果无解,输出 -1
。
解答
首先,a
,那么就可以设状态为 该位置选 B
或是该位置不选 B
(即选 C
)。对于字母 b
、c
同理。
连边也是好连的,但是有一种特殊情况,设原序列为 ba
,但是有 1 C 2 A
的限制,那么这种情况就是只要选了 1 C
就不合法了。那么就要连一种最能想得到的不合法的情况:1 C
1 B
。只要你选了 1 C
,那么就选 1 B
,就一定不合法。最后跑 2-SAT 即可。
但是现在 x
, 它是 a
还是 b
(注意到 c
是没有必要的,因为 a
包含了「选 B
」和「选 C
」,b
包含了「选 A
」和「选 C
」,所以也就没必要搞个 c
了)。然后再跑 2-SAT,最后随便输出一个合法方案即可。
CF1404E Bricks
题目大意
你有一个 #
)要么涂白(.
)。你需要用若干个长为一,宽为任意正整数或者宽为一,长为任意正整数的长方形去覆盖所有黑色格子,要求不能盖到白色格子上,不能盖到其他长方形上,不能盖出格子纸的边界,求最少用多少个长方形。
数据保证至少有一个黑色格子。
解答
一种经典的 trick 就是网格图可以被转化为二分图。
这道题就可以将连接相邻(指边相邻)的两个点的边看为二分图上的点。然后设竖着的点在左边,横着的点在右边。
因为若你选了竖着的点,相当于是你选了上、下两个原图中的点组成竖着的矩形。若你选了横着的点,相当于是选了左、右两个原图中的点组成横着的矩形。对于每一个点,选了竖着的就不能选横着的。那么就可以连边,建二分图,然后求这个二分图的最大独立集。
根据 Konig 定理,二分图最大独立集等于顶点数减去最大匹配。
然后再用所有点的个数减去最大独立集就是最少用几个长方形了。
P3227 切糕
古法酿题,越酿越香(?
题目大意
出于简便考虑,我们将切糕视作一个长
与每个纵轴(一共有
个纵轴)有且仅有一个交点。即切面是一个函数 ,对于所有 ,我们需指定一个切割点 ,且 。 切面需要满足一定的光滑性要求,即相邻纵轴上的切割点不能相距太远。对于所有的
和 ,若 ,则 ,其中 是给定的一个非负整数。
可能有许多切面
解答
老题。
我们对于每一个
每一个
但是还有一些限制:即相邻的点的高度必须
然后跑最小割,即为答案。
CF724E Goods Transportation
题目大意
给一张图,除了
对于任意
解答
首先,将最大流转化为最小割。
我们有两个集合
那么我们可以设
, 。 , 。
值即为两者之间取最小值即可。
最后答案即为
- Title: 3 月图论讲课专题题目
- Author: 11490DX
- Created at : 2025-03-21 08:05:36
- Updated at : 2025-03-21 11:25:30
- Link: https://11490dx.net/2025/03/21/R703-graph-lect-sum/
- License: This work is licensed under CC BY-NC-SA 4.0.