约定
- 在下文中,索引从 \(1\) 开始。
存在欧拉路径的判断
无论是有向图还是无向图,仅考虑起点、终点和其他节点的度数即可。
找到欧拉路径
若判定存在欧拉路径,从起点开始 dfs,边的出栈序即为所求。需要当前弧优化,能做到 \(O(m)\)(\(m\) 为边数)。
最小化字典序
直接将边排序,贪心 dfs 即可。
欧拉路径的应用
边定向问题
问题:给定 \(m\) 个二元组构成的组 \(E=((u_1,v_1),(u_2,v_2),\dots,(u_m,v_m))\),你需要将所有二元组重排序,并将组 \(E\) 重排序,使得 \(\forall i\),满足 \(E[i][2]=E[i+1][1]\)。
解说:这就是寻找欧拉路径。
双重平均分配问题
问题:给定大小为 \(n\times m\) 的数组 \(S\),且 \(\forall i,j\),有 \(S[i][j]\in\mathbb{N}\)。你需要构造一个 \(n\times m\) 的非负整数数组 \(A\),满足
- \(\forall i,j\),满足 \(A[i][j]\leq S[i][j]\).
- \(\forall i\),满足 \(\displaystyle \sum_{j=1}^m A[i][j]=\frac{1}{2}\sum_{j=1}^m S[i][j]\).
- \(\forall j\),满足 \(\displaystyle \sum_{i=1}^n A[i][j]=\frac{1}{2}\sum_{i=1}^n S[i][j]\).
若不存在构造,需报告无解。
解说:建无向图 \(G\),建立点集 \(\{x_1,x_2,\dots,x_n,y_1,y_2\dots,y_m\}\)。\(\forall i,j\),连接 \(S[i][j]\) 条无向重边 \(x_i\leftrightarrow y_j\)。若 \(G\) 存在欧拉回路,则有解。设欧拉回路为 \(P\),则 \(A[i][j]\) 可构造为 \(P\) 中边 \(x_i\to y_j\) 的条数。时间复杂度 \(O(n+m+\sum S[i][j])\)。
例题:P9731 [CEOI 2023] Balance - 洛谷
行列式求值
有的时候,直接 \(O(n^3)\) 正常消元即可。
任意模数行列式求值
需要使用辗转相除来实现消元。时间复杂度 \(O(n^2\log V+n^3)\)。
P7112 【模板】行列式求值 - 洛谷
矩阵树定理(无证明)
无向图生成树计数:\((\)度数矩阵 \(-\) 邻接矩阵\()\) 的任意余子式。
有向图内向生成树计数:\((\)出度矩阵 \(-\) 邻接矩阵\()\) 的根余子式。
有向图外向生成树计数:\((\)入度矩阵 \(-\) 邻接矩阵\()\) 的根余子式。
BEST 定理
对于有向欧拉图 \(G=(V,E)\),欧拉回路数量为(回路无起点,边有标号)
其中 \(\text{deg}[u]\) 为节点 \(u\) 的出度(也是入读),\(T[S]\) 表示以 \(S\) 为根的内向生成树数量。
证明可以考虑构造欧拉路和内向生成树的双射,让内向生成树的边成为关于该节点最后一条边。
这可以得到,\(\forall u,v\),有 \(T[u]=T[v]\)。
例题:P10101 [ROIR 2023] 一个普通的字符串问题 (Day 2) - 洛谷