省选集训 2025.12.29 图论与网络流
感觉表达能力退化了,大家体谅一下吧。
Meeting for Meals
容易发现对于每个节点只需要记录距离其最近的一个出发点,多源最短路即可。
枚举每条边,若两端点所属的出发点不同就尝试更新这两个出发点的答案,有一些小细节,这里就不多提。
输出答案时注意特判一下两出发点位置相同的情况。
Hidden Graph
构造。
这个“对于每个子图都存在一个度数小于等于 \(k\) 的点"的条件很奇怪。转换一下,这相当于该图与其所有子图都可被 \(k + 1\) 染色。
证明也很简单,归纳一下即可。首先找到图中度数最小的那个点,将其删去,剩下的子图就成了一个子问题,假设其可被 \(k + 1\) 染色,那么由于删去的那个点度数至多为 \(k\),所以同样可染为 \(k + 1\) 种颜色之一。
接下来考虑一个个加点,假设当前已经加了 \(1,2,\dots,i-1\),准备加 \(i\),由于前 \(i-1\) 个点可以被 \(k+1\) 染色,也就是可以被分为 \(k+1\) 组且每组内部没有连边,所以可以在 \(k+1+deg_i\) 次询问内求出与 \(i\) 相连的所有边。然后你惊奇地发现这样做总询问次数就是 \(m+(k+1)n\le 2nk+n\)。
当然这里需要注意一个问题,就是不能直接在当前染色方案下直接将 \(i\) 染色,因为 \(i\) 的度数可能大于 \(k\),需要重新对于整张图染色,用堆之类的可以做到大概 \(\text O(nk\log n)\)。
总复杂度 \(\text O(n^2k\log n)\),可以通过。
Hidden Bipartite Graph
不是你题目名咋这么像?
这道题看似和前一道有点像但做法上并没有多大关系。
思考一下 \(600\) 与 \(20000\) 的关系,发现 \(n^2\) 或者只有常数都不太现实(根号自动消失),考虑一下有没有带 \(\log\) 的构造。
发现只要我们确定出来那些点再左侧那些点在右侧那么很轻松就可以判断出这是否是二分图。
那么如何划分呢?经典套路:考虑找到一颗生成树。
我们以 \(1\) 为根,一层一层往下扩展,每次把所有还没在树上的点提出来,用类似线段树的分治方法可以在 \(2\log\) 的询问次数内找到与当前层有连边的所有点。
此时判断是判断好了,但是他要求我们输出一个奇环,这就有点难办了。
考虑时刻把左侧点和右侧点存下,每次加入一个点是就直接判断是否合法,若不合法则用类似线段树上二分的方法找到与其相连的那个点。找到后又该怎么做呢?只需要对于每个店在加入之时都用同样的方法 \(\log n\) 次询问找到其父亲,查询时就容易求出 lca。
总操作次数大约为 \(3\log n+an\) 可以过。
Case of Computer Network
一眼题,边双缩点后判断割边上是否有反向的边就行。
地地铁铁
大只结论题,我太菜了,详见大佬题解。
Cycle sort
好题。
先考虑一下没有数相同也就是排列的情况。
设排序后的数组为 \(b_i\),那么只要从每个 \(a_i\) 向 \(b_i\) 连一条边就可以得到若干个环。
那么最小循环长度之和显而易见就是 \(n\) 了(为方便自动排除自环的情况,实际上自环直接忽视即可)。
最小操作次数呢?
我们发现如果将所有环并在一个大环操作那么每个环都只会有最开头的那个位置是错位的,并且刚好可以再用一个环处理回去(可自己画一下图),此时操作次数为 \(2\),循环长度之和为 \(n+c\),其中 \(c\) 为环的个数。
容易发现我们将多少个环套在一起循环长度之和就会加多少,那么最优的个数就很容易找到了,这里不再细说。
现在我们来想想不是排列的情况该怎么办?此时我们先离散化一下,然后将所有 \(a_i\) 连一条向 \(b_i\) 的边(排除 \(a_i=b_i\)),此时容易发现所有点的出度等于入度,那么这就是若干个存在欧拉回路的连通块,和环一样做就行了。
具体实现时可以在每条边上存下对应的 \(i\)。
话说今天才会构造欧拉回路,我在干什么……

浙公网安备 33010602011771号