图论杂题选做
选做不包含网络流的图论杂题
标*为待完成
由于时间关系,以及我很懒
大部分题都没有写代码,如果有错,请大佬指出,如果有理解不到位的地方,欢迎和我讨论
最短路和最小生成树
1.Travel
给定一张 𝑛 个点的完全图,其中 𝑚 条边的权值为 𝑎,其余的为 𝑏,给定这 𝑚 条边,求从 1 到 𝑛 的最短路。
数据范围\(:𝑛≤10^5,𝑚≤5×10^5\)。
- 简单题
- 考虑\(w(1,n) = min(a,b)\),那么直接输出即可
- 否则,\(dis(1,n) \le max(a,b)\)
- 也就是说我们只要保留较小的一种边,如果是\(a\),bfs即可,否则,在补图上bfs即可
- 具体地,如何在补图上bfs呢,用一个栈存一下还没有被遍历的点,用一个used数组标记,然后每次先把所有还没遍历到的点弹出来,然后把正图能到达的弹回去,剩下的塞队列里面,复杂度\(O(n + m)\)
2.新年的繁荣
- 给定一张 \(𝑛\) 个点的完全图,每个点有权值 \(𝑎_𝑖\),\((𝑖,𝑗)\) 边权为 \(a_𝑖\) and \(a_𝑗\)。
求最大生成树。
数据范围:\(𝑛≤10^5,0≤𝑎_𝑖<2^𝑚,𝑚≤18。\)
- 挺巧妙的题,考虑\(boruvka\)算法
- 根据这个算法,我们可以先把所有相同的点缩成一个联通块
- 以下认为所有数两两不同
- 那么题目变成了有\(n\)个数,\(m\)种颜色,对每个数找一个异色的数使得\(and\)后的值最大,总复杂度就是\(O(这样做的复杂度*log)\)
- 如果是\(xor\)我们可以用\(trie\)维护包含该数的最小or最大颜色编号来判断(是否不在同一颜色),\(and\)可以吗?我们考虑如果该位是\(1\),我们要走\(0\),否则我们要走\(1\)或者\(0\),注意到从来没有只要走\(0\),不要走\(1\)的情况,这启发我们直接把每个\(1\)的子树合并\(0\)里面
- 注意这样下来我们实际上得到的是什么呢?每个点\(x\)维护的实际上是它的超集\(max\)和超集\(min\),所以直接维护这两个即可,把\(trie\)树抛掉,单次复杂度\(O(2^m * m + n)\)
- 总复杂度\(O((2 ^ m * m + n) * \log n)\)
*3.JOI Open 2019病毒实验
生成树与欧拉回路计数
\(Matrix\ Tree\ theory\)
- 一个非常巧妙的组合证明:有向图矩阵树定理的一个简单组合证明
1.Expectation
- 题意简述:给定一张 𝑛 个点 𝑚 条边的无向连通图,每条边有两个权值 𝑎,𝑏,求以 𝑎 建出来的最小生成树的权值 𝑏 的和的期望(每棵树中均匀随机)。
模 998244353。
数据范围:\(𝑛≤10^5,𝑚≤2×10^5\),相同的 \(𝑎\) 的数量不超过 \(30\)
- 根据最小生成树的性质,任意相同的最小生成树,每种边权的数量都是一样的
- 那么我们可以在每次\(kruskal\)的过程中一次性加入所有边,对每个连通块分别做加性的矩阵树定理即可
- 复杂度\(O(m/30 * 30^3)\)
2.白金元首与独舞
- 简单题,把空格子和最外面的空看作点,把箭头看作边,容易发现合法情况即形成一个根为外面空的点的内向树
- 因为预处理每个非空的点会走到哪个空的,因为空格子数\(\leq 200\),连完边矩阵树定理即可
- \(O(200^3)\)
3.生成树计数
- 给定一张 𝑛 个点的带权无向完全图,求所有生成树权值的 𝑘 次方之和,生成树权值定义为边权和,模 998244353。
数据范围:\(𝑛≤30,0≤𝑘≤30。\)
- 类比加性矩阵树定理
- 我们考虑如何构造一种代数结构作为边权使得满足题目要求
- 构造类似\(a^k \circ b^k = (a + b)^k\)的代数结构
然后我就不会了- 设当前树为\(T\),边权为\(w_1....w_{n-1}\)
- 看了题解觉得很妙,我们考虑\(e^{w_ix}\)
- \(\prod_{i = 1}^{n-1} e^{w_ix} = e^{(\sum_{i}w_i)x}\)
- 令\(\sum_{i}w_i = S(T)\),我们要求的是\(\sum_TS(T)^k\)
- 原式\(=\sum_{j=0}\frac{S^j}{j!}\)
- 所以\(S^k = (\prod_{i = 1}^{n-1} e^{w_ix}[x^k])*k!\)
- 可以用多项式暴力高斯消元,也可以选\(n * k + 1\)个点值,然后拉格朗日插值
*BEST定理
2-SAT
1. Binary Code
题意简述:给定 \(𝑛\) 个 \(01\) 字符串,每个字符串至多有一位变成了 \(?\)。
请给每个 \(?\) 确定变成 \(0\) 或 \(1\),使得最终不存在两个串满足其中一个是另一个的前缀。请输出一种可行方案。
数据范围:总串长\(≤5×10^5。\)
- 看着就很\(2 - SAT\)
- 考虑我们用\(n\)对布尔型变量,表示第\(n\)个字符串究竟是选\(0\),还选\(1\),如果已经确定就相等于强制选\(0\)或者\(1\),这个可以根据\(2-SAT\)那套理论连边
- 考虑我们剩下的限制是什么,不存在两个串满足其中一个是另一个的前缀,考虑利用\(trie\),那么就是选了某个点,则祖先的所有点都不能选,考虑每个链上的点当作一个虚拟变量,向父亲连边,挂上一个相反的布尔型变量(即子树中如果有点选了,那你就不能选,得选相反的),同一个点上有多个布尔型变量的时候就把一个点拆成若干个点练成的链即可.
2.Flags
- 数轴上有 \(𝑛\) 对点 \((𝑥_0),(𝑦_𝑖)\),请从每对点中选出一个,最大化选出的点之间距离的最小值。
数据范围:\(𝑛≤10^4。\)
- 先二分答案,设为\(d\)
- 考虑以\(d\)为块长,将整个数轴分成若干块(这一步可以用hash实现)
- 然后对每个块内,分别前缀优化连边,后缀优化连边
- 那么对任意一个点,它最多就连两条边,一条连到前缀优化,一条连到后缀优化
- 做\(2-SAT\)即可
- 这个思想可以拓展到块长固定的一系列滑动窗口问题
- 时间复杂度\(O(n \log A)\)
Hall定理
Hall定理简介:
- 给定一个二分图,设其左右的点集分别为\(L,R\),设\(N(S)\),表示与\(S\)有边相连的点集
- 那么最大匹配为\(|L|\)的充要条件为,对于任意\(S \subseteq L\),都有\(|N(S)| \ge |S|\)
- \(proof:\)必要性显然,因为如果存在一个\(S\),\(|N(S)| < |S|\),那么\(S\)这些元素必然不可能完全匹配
- 充分性:考虑找到任意一个集合\(|N(S)| \ge |S|\),注意删边完一定不会让答案更优,通过删掉一些边,使得\(|N(S)| = |S|\),然后把\(N(S),S\)都从图里删掉,则剩下的点仍然满足\(Hall\)定理的条件,归纳下去即可
1.LYZ
- 有鞋码为 1∼𝑛 的鞋子各 𝑘 双,共 𝑛𝑘 双。
脚长为 𝑥 的人可以穿鞋码在 [𝑥,𝑥+𝑑] 内的鞋子。
𝑞 次操作,每次给出 (𝑟,𝑥) 表示脚长为 𝑟 的人增加了 𝑥 个(如果 𝑥 为负数表示减少)。
请动态维护每次操作结束后是否可以给这些人分配鞋子。
数据范围:\(𝑛≤2×10^5,𝑞≤5×10^5,1≤𝑟≤𝑛−𝑑。\)
- 考虑这么一个二分图模型,左边是人,右边是鞋子,问左边是否存在完美匹配
- 考虑\(Hall\)定理,即询问最小的\(|N(S)| - |S|\)是否小于\(0\),那么我们可以把所有脚长相等的点并起来,当作一个有权值的点,不妨设\(a_x\)表示脚长为\(x\)的点有多少,这样一定不会使\(|N(S)| - |S|\)更劣
- 因为每次向右连边是一段长度恒等的区间\([x,x+d]\),那么假设存在一个集合\(S\),满足\(|N(S)| - |S| < 0\),那么必然存在集合中一个长度连续的区间\([l,r]\),满足\(a[l,r] > (r - l + 1 + d) * k\)
- 移项有\(a[l,r] - (r - l + 1) * k > d * k\)
- 令\(a' = a - k\),那么维护\(a\)的最大连续子段和,若大于\(d * k\)则不存在,否则,存在
- 用线段树维护即可
杂项
1. Rally
给定一张 𝑛 个点 𝑚 条边的 DAG,每条边长度为 1。
你可以删除一个点,最小化删除后的最长路径长度。
数据范围:\(2≤𝑛≤5×10^5,𝑚≤10^6。\)
- 性质题,想假了..
- 对于\(DAG\),一个性质,设拓扑序\(< i\)的集合为\(S\),大于的为\(T\),那么只会有\(S->T\)的边,不会有\(T->S\)的边(其实挺显然的)
- 那么我们按照拓扑序从小到大动态维护\(S\),\(T\)集合,可能的最长路只有\(S->S\),\(T->T\),\(S->T\),前两种是平凡的,后面的拿个数据结构维护插入一个数,删除一个数,寻找最大值即可