\(1.\) 基本定义
定义 \(1.1\) : 图 \(G\) 中经过每条边恰一次的回路称为欧拉回路,经过每条边恰一次的路径称为欧拉路径。
定义 \(1.2\) : 存在欧拉回路的图称为欧拉图 ,存在欧拉路径但不存在欧拉回路的图称为半欧拉图。
\(2.\) 欧拉图的判定
定理 \(2.1\) : 无孤立点的无向图 \(G\) 为欧拉图 , 当且仅当图 \(G\) 联通且每个顶点度数是偶数。
证明 : 先证必要性 , 首先这张图显然是联通图。 如果存在回路 \(v_{0} , v_{1} , v_{2} , ... v_{m - 1} , v_{0}\) , 那么对于每个顶点 , 一条连入的边就对应着一条连出的边 , 故每个点的度数都是偶数。 接着证明充分性 , 从图 \(G\) 中任意节点 \(v_{0}\) 出发 , 经关联的边 \(e_{1}\) 进入 \(v_{1}\) , 因为 \(v_{1}\) 的度数是偶数 , 所以必然有一条向外连的边 , 故一直重复这个过程必然能走出一个圈 \(c\) , 如果圈 \(c\) 恰好为图 \(G\) , 那么命题得证。 否则在图中去掉 \(c\) 剩下图 \(G\'\) , 显然 , 图 \(G\'\) 也是联通的 , 且每个顶点的度数都是偶数 , 那么一定可以形成另外一个圈 \(c\'\) , 且两个圈有一个公共顶点 , 那么将它们合并就可以得到一个新的大圈。 重复上述过程 , 最终一定能拼出图 \(G\)。
定理 \(2.2\) : 如果无向联通图有 \(2k\) 个奇顶点 , 则图 \(G\) 可以用 \(k\) 条路径将每条边覆盖一次。 且至少要用 \(k\) 条路径。
证明 :首先证明路径条数的下界 , 设图 \(G\) 可以分解为 \(h\) 条链 , 每条链上至多两个奇顶点 , 所以有 \(2h \geq 2k\) , 故 \(h \geq k\)。因此 , 路径数量的下限是 \(k\)。
接下来只需构造一组方案 , 就可以证明这个结论的正确性了。 把这 \(2k\) 个奇顶点分成 \(k\) 组 \((v_{1} , v_{1}\') , (v_{2} , v_{2}\') .... (v_{k} , v_{k}\')\) , 在每组点间连边 , 得到新图 \(G\'\) , 显然 \(G\'\) 存在欧拉回路。 求出欧拉回路后 , 再把 \(k\) 条新添的边从回路中去掉 , 这样这个圈就被分成了至多 \(k\) 段。 于是得到了 \(k\) 条链。
定理 \(2.3\) : 无孤立顶点的无向图 \(G\) 为半欧拉图 , 当且仅当图 \(G\) 联通且 \(G\) 的奇顶点个数为 \(2\)。 并且此时两个奇顶点分别为欧拉路径的起点终点。
证明 : 类似于定理 \(2.1\)。
下面的定理是关于有向欧拉图的 :
定理 \(2.4\) : 无孤立点的有向图 \(G\) 为欧拉图 , 当且仅当 \(G\) 弱联通且所有入度等于出度。
定理 \(2.5\) : 对于联通有向图 \(G\) , 若所有顶点入度与出度差的绝对值之和为 \(2k\) ,则图 \(G\) 可以用 \(k\) 条路径将图 \(G\) 的每一条边经过一次,且至少要使用 \(k\) 条路径。
证明 : 类似于定理 \(2.2\)。
定理 \(2.6\) : 无孤立点的有向图 \(G\) 为半欧拉图,当且仅当图 \(G\) 弱连通,且恰有一个顶点 \(u\) 入度比出度小 \(1\) ,一个顶点 \(v\) 入度比出度大 \(1\) , 其余顶点入度等于出度。此时存在 \(u\) 作为起点 ,\(v\) 作为终点的欧拉路径。
证明 : 类似于定理 \(2.1\)。
\(3.\) 欧拉回路的生成
\(Fluery\) 算法
算法大意 : 每次选出一条不是桥的边 , 深度优先搜索。 该算法可以在存在欧拉回路时构造出一组方案 , 否则构造一条欧拉路径。时间复杂度 \(O(N + M)\)
具体实现 , 这里给出我的一段代码 :
\(Hierholzer\) 算法 :
算法大意 : 与定理 \(1.1\) 的证明是相同的 , 任选一点深度优先搜索找圈 , 然后递归地求解子问题合并。时间复杂度 \(O(N + M)\)。
具体实现 : 一段伪代码如下 :
\(4.\) 欧拉图与相关性质 :
定理 \(4.1\) : 对于任意无向连通图 \(G\) ,一定存在回路使得每条边经过恰好两次。进一步地,存在回路使得每条边的两个方向各经过一次。
证明 : 将每条边重复 \(2\) 次 , 得到了无向图 \(G1\) , \(G1\) 是联通图且每个点度数必然是偶数 , 因此 \(G1\) 是欧拉图 , 存在欧拉回路。
同理,若把图 \(G\) 的每条无向边变为两条反向的有向边,得到有向图 \(G2\) 。\(G2\) 也存在欧拉回路,满足图 \(G\) 每条边的两个方向各经过一次。
定理 \(4.2\) : 对于无向图 \(G\) ,所有顶点的度都是偶数等价于图 \(G\) 有圈分解。圈分解即为用若干个圈(不重复经过顶点的回路)使图 \(G\) 的每一条边恰经过一次。
证明 : 同定理 \(2.1\)。
定理 \(4.3\) : 对于不存在欧拉回路的图 \(G\) , 若最少用 \(a\) 条路径将图 \(G\) 的每一条边经过一次 , 若最少在图 \(G\) 中加入 \(b\) 条有向边使之成为欧拉图,则 \(a\) 一定等于 \(b\)。
证明 : 同定理 \(2.2\)。
\(5.\) 欧拉图的生成问题
\(5.1\) : 混合图欧拉回路
问题大意 : 给定包含有向边与无向边的弱连通图 \(G\) ,判断图 \(G\) 是否为欧拉图。若存在 ,求出一条欧拉回路。
解决办法 : 判定混合图是否是欧拉图是复杂的 , 但如果能将无向边全部转化为有向边。 接着运用 "入度 = 出度" , 问题就很方便解决了。 不妨记 \(s_{u} = outdeg_{u} - indeg_{u}\) 。 钦定所有边都是正向 (\(u -> v\)) 连的 , 那么反转一条这样的边 , 就会使 \(s_{u}\) 减小 \(2\) , \(s_{v}\) 增大 \(2\)。 而最终的要求是所有点 \(s_{u} = 0\)。
考虑网络流 , 不妨将正权点看作 "供给" , 而负权点看作 "需求" , 每条边有容量上限。 那么有如下的建图 :
对于正权点 \(u\) , 从源点向 \(u\) 连流量为 \(|\frac{s_{u}}{2}|\) 的边。
对于负权点 \(u\) , 从 \(u\) 向汇点连流量为 \(|\frac{s_{u}}{2}|\) 的边。
对于原图中的边 \(u -> v\) , 从 \(u\) 向 \(v\) 连流量为 \(1\) 的边。
求解这张图的最大流 , 若不能满流 , 则说明构造失败。 否则就有如下构造 :
若无向边 \((u , v)\) 对应的边在最大流中流量为 \(1\) ,则将原来指定的方向 \(u -> v\) 改为 \(v -> u\)。这样 ,就得到了图 \(G\) 的欧拉定向,满足所有点的入度等于出度。利用有向图欧拉回路生成算法即可求出图\(G\)的欧拉回路。
时间复杂度 : \(O(MaxFlow(N , M))\)。
\(5.2.1\) : 中国邮递员问题
问题大意 : 给定有向带权连通图 \(G\) ,求出一条总边权和最小的回路 ,使得经过每一条边至少一次。
解决办法 : 首先发现 “每条边经过至少一次” 可以转化为 : 添加若干条边 , 使得图中存在欧拉回路。 仿照 \(5.1\) 问题的解法 ,同样记 \(s_{u} = outdeg_{u} - indeg_{u}\)。
每将一条边重复一次 , 等价于将 \(s_{u}\) 增加了 \(1\) , 而将 \(s_{v}\) 减小了 \(1\)。 同时产生了边权的代价。
于是用费用流计算最小代价即可。 建图方式类似 \(5.1\) , 只不过每条边多了费用 , 需要用 \(Edmonds \ Karp\) 算法求解。
最后根据残量网络算出每条边重复了几次 , \(Fluery\) 算法求欧拉回路即可。
时间复杂度 : \(O(CostFlow(N , M))\)。
\(5.2.2\) : 中国邮递员问题 \(2\)
问题大意 : \(5.2.1\) 的无向图版本
解决办法 : 类比有向图的做法 , 在图中重复一些边 , 使每个顶点度数变为偶数 , 那么每两个点的度数变为偶数花费的代价就是它们之间的最短路 , 首先求出最短路 , 然后一般图最小权完美匹配即可。
时间复杂度 : \(O(CostFlow(N , M))\)。
\(6.\) 欧拉图计数问题
\(6.1.1\) : 图计数 \(1\)
问题大意 : 给定 \(n\) ,求包含 \(n\) 个点的所有点度为偶数的有标号简单无向图个数。
解决办法 : 设 \(f_{n}\) 表示 \(n\) 个点的答案 , 那么加入第 \(n\) 个点 , 其必须和前 \((n - 1)\) 个度数为奇数的点连边 , 而因为度数为奇数的点一定是偶数个 , 因此答案就是 \((n - 1)\) 个点的无向联通图的个数 , 故 \(f_{n} = 2 ^ {{n - 1 \choose 2}}\)。
\(6.1.2\) : 图计数 \(2\)
问题大意 : 给定 \(n\) ,求包含 \(n\) 个点的所有简单联通欧拉图个数。
解决办法 : 根据 \(6.1.1\) 的做法已经得知了偶数的做法 , 那么欧拉图的限制无非就是加上了 "联通" 这个限制 , 不妨设 \(g_{n}\) 表示 \(n\) 个点的答案 , 这类问题有个经典的转移方式 , 考虑枚举 \(1\) 号联通块的大小 , 有 :
\(g_{n} = f_{n} - \sum_{i = 1}^{n - 1}{{n - 1 \choose i - 1}f_{i}s_{n - i}}\)
那么分治 \(FFT\) 就可以解决这个问题了 , 多项式求逆可以进一步优化到 \(O(NlogN)\)。
\(6.2.1\) : 图计数 \(3\)
问题大意 : 给定一个无向联通图 \(G\) ,求有多少个支撑子图 \(G\'\) ,满足每个顶点的度都是偶数。
解决办法 : 首先有一个高斯消元求解线性方程组的做法 , 对每条边记一个变量 \(x_{i}\) , 那么对于每个点有限制 : \(x_{e_{1}} \oplus x_{e_{2}} \oplus x_{e_{3}} .... x_{e_{d}} = 0\)。 答案即为 \(2 ^ {这个方程组的*元个数}\) , 时间复杂度 \(O(N ^ 2M)\)。考虑优化这个做法 , 首先用任意一种方法求得图 \(G\) 的任意一棵生成树 , 容易发现 ,对于任意一种非树边的选法 , 树边的选法是唯一的(从叶子节点开始向上考虑)。 故满足条件的子图个数 \(2 ^ {m - n + 1}\)。 事实上也可以仿照线性基求最大路径异或 , 得到同样的结论。
\(6.2.2\) : 图计数 \(5\)
问题大意 : 给定一个无向图 \(G\) ,求有多少个支撑子图 \(G\'\) ,满足每个顶点的度都是偶数。
解决方法 : 每个联通块是独立的 , 根据 \(6.2.1\) 的推论 , 可知答案为 \(2 ^ {m - n + c}\)。
\(6.3\) : \(BEST\) 定理
欧拉图 \(G\) 中欧拉回路的数量为 \(T_{1} \prod_{i=1}^{N}{(d_{i} - 1)!}\)。 其中 \(T_{1}\) 表示以 \(1\) 为根的内向树个数 , 具体实现时可以用 \(Matrix - Tree\) 定理 , 求解矩阵的行列式。
\(7.\) 论文中出现的例题和题解 :
\(7.1\)
题目描述 :
题解:
首先将每条边重复两遍得到 \(G\'\) , 那么现在要做的就是在 \(G\'\) 中删去两条边 , 使其存在欧拉路径(奇顶点数为 \(0\) 或 \(2\)) 。 那么只有 \(3\) 种可能的情况 :\((1).\) 删去的两条边都是自环 \((2).\) 删去两条边恰有一条是自环 \((3).\) 删去两条边都不是自环 , 但有公共点。 分别讨论即可。 时间复杂度 \(O(N + M)\)
\(7.2\)
题目描述 :
题解 :
根据定理 \(4.2\) , 首先需要满足的条件是黑边构成的联通子图中每个点的度数是偶数。 否则必然无解。
一个结论是 : 答案为这张图包含黑边的联通分量个数 , 其理由在于对于每个包含黑边的联通块 , 让黑边经过 \(1\) 次 , 白边经过 \(2\) 次 , 用欧拉回路构造即可。
时间复杂度 : \(O(N + M)\)
\(7.3\)
题目描述:
题解:
首先直接做是困难的 , 不妨转化问题 , 考虑这个图需要几条路径才能使每一条边经过一次。
不包含奇顶点的联通分量存在欧拉回路 , 只需 \(1\) 条即可。 而包含奇顶点的则需要 \(\frac{奇顶点个数}{2}\) 条路径。 故对每个联通分量分别讨论即可 , 注意 \(1\) 为孤立点要单独考虑。 时间复杂度 \(O(N + M)\)。
\(8.\) 补充例题 :
\(8.1\) :
题解 :
来自 \(2020\) 年国家集训队作业。
首先给出结论 : 一张无向图能够给边定向且出入度都是偶数当且仅当 \(M\) 为偶数且存在欧拉回路。
必要性 : 首先因为每个点的出度和入度都是偶数 , 所以所有点的度数相加一定也是偶数。 因此边数为偶数。如果不存在欧拉回路 ,那么必然有一个点的度数是奇数 , 矛盾。
充分性 : 考虑直接构造欧拉回路 , 路径上的边方向交替定向 , 这样一个点的入度 / 出度在回路序列中就被相邻的点贡献了两次。因此这样每个点的入度和出度都是偶数。
那么考虑这道题的解法 , 不妨将度数为奇数的点两两配对 , 如果还有剩余就加上一个自环 , 再求一遍欧拉回路 , 就构造出了方案。
时间复杂度 : \(O(N + M)\)。
\(8.2\) :
题解 :
来自 \(2020\) 年国家集训队作业。
首先建一张二分图 , 将 左侧的 \(X\) 和 右侧的 \(Y\) 连边。 这样只要交错染色即可。
发现可能有若干个度数为奇数的点 , 那么将其两两配对即可。 并不会对正确性造成影响。
时间复杂度 : \(O(N + M)\)
\(8.3.1\)
引入 :
题解 :
首先有 \(Burnside\) 引理 :
\(L = \frac{1}{|G|}\sum_{g \in G}{M(g)}\)
考虑枚举点的置换 , 因为点的置换和边的置换构成双射 , 因此只需计算其边等价类个数。
将置换拆成若干个循环的乘积形式 , 分两类边进行考虑 :
第一类 : 边的两个端点位于同一个环中 , 容易发现两条一类边在不同的等价类中当且仅当其距离不同 , 因此长度为 \(b\) 的循环有 \(\lfloor \frac{b}{2} \rfloor\) 个等价类。
第二类 : 边的两个端点不在同一个环中 , 设它们的环长分别为 \(b_{i} , b_{j}\) , 容易发现共有 \(gcd(b_{i} , b_{j})\) 种不同的边等价类。
故不同等价类共有 : \(\sum{\lfloor \frac{b_{i}}{2} \rfloor} + \sum_{i < j}{gcd(b_{i} , b_{j})}\) 个。
接着对置换进行统计。 显然不能枚举每个置换 , 但发现对于 \(b\) 相同的置换答案也相同。 考虑枚举 \(b\) , 即本质不同的不相交循环长度的可重集。这相当于 \(n\) 的整数分拆 , 由于 \(n \leq 53\) , 拆分数并不大 , 所以复杂度在可接受范围内。
设 \(b_{1} \leq b_{2} \leq b_{3} \leq .... \leq b_{n}\) , 其中 \(\sum{b_{i}} = n\) , 那么其对应着多少个置换呢?
考虑 \(1\) 到 \(n\) 的每个点 , 分配它们到一个置换中 , 其方案数 \(\frac{n!}{\prod{b_{i}!}}\) , 发现这样会算重 , 因为可能存在相同的 \(b_{i}\) , 因此正确的答案是 \(\frac{n!}{\prod{b_{i}!c_{i}!}}\)。
化简后 , 求得答案为 \(\sum{\frac{1}{\prod{b_{i}!c_{i}!}}m^{\sum{\lfloor \frac{b_{i}}{2} \rfloor} + \sum_{i < j}{gcd(b_{i} , b_{j})}}}\)
时间复杂度 : \(O(log N \sum_{p \in Partition(n)}{len(p) ^ 2})\)。
\(8.3.2\)
题解 :
前面的推导是一模一样的。
考虑方案数如何计算 , 对于在相同置换中的边 , 当且仅当 \(l_{i}\) 为偶数 , 且边的距离为 \(\frac{l_{i}}{2}\)。
对于不同置换中的边 , 可以通过 \(\frac{l_{i}}{gcd(l_{i} , l_{j})}\) , 以及 \(\frac{l_{j}}{gcd(l_{i} , l_{j})}\) 的奇偶性得到。
那么问题就简化为 :
给定 \(k\) 个点和若干条边,每个点的初始点权为 \(0\) ,每个点 \(x\) 可以有 \(cntp_{x}\) 次机会使点权异或 \(1\),每条边 \((x , y)\) 可以有 \(cnte_{x , y}\) 次机会使 \(x , y\) 两个端点的点权同时异或 \(1\) ,询问使得每个点最终的点权仍然都为 \(0\) 的方案数。
任取一棵生成树 , 容易发现在点和非树边固定的情况下 , 方案是唯一确定的。
其余和上题类似。