A
Description
给定一个包含 nnn 个点,mmm 条边的有向图。
你需要规划出一条经过每条边恰好一次的欧拉回路。
1≤n,m≤1061 \le n,m \le 10^61≤n,m≤106
Solution
令 degudeg_udegu 表示节点 uuu 的度数。
首先,有解当且仅当 ∀i∈[1,n]\forall i \in [1,n]∀i∈[1,n] 满足 degideg_idegi 为偶数,且整个图形成了一个大连通块。
接着,我们考虑构造出一组合法解。
考虑执行下面的流程:
- 先将 111 压入队列。
- 每次取出队顶,令队顶节点为 uuu。
- 找到 uuu 第一条往外的未被经过的边 u→vu \to vu→v,将 vvv 压入队尾;同时,我们也要将 headuhead_uheadu 修改为 u→vu \to vu→v 的下一条边以保证复杂度正确(可以理解为 Dinic 中的 ⌈\lceil⌈ 当前弧优化 ⌋\rfloor⌋)。
- 若这样的边找不到,则 uuu 已无法往外扩展;于是弹出队顶,并将 uuu 压入存放答案的序列中。
时间复杂度 O(m+n)O(m+n)O(m+n)。
B
Description
给定一个包含 nnn 个点,mmm 条边的有向图。
你需要规划出一条经过每条边恰好一次的欧拉道路。
Solution
令 degudeg_udegu 表示节点 uuu 的度数。
首先,有解当且仅当 cnt=∑i=1n[degi mod 2=1]≤2cnt=\sum_{i=1}^n [deg_i \ \text{mod} \ 2=1] \le 2cnt=∑i=1n[degi mod 2=1]≤2,且整个图形成了一个大连通块。
考虑将 B 转化为 A。
- 若 cnt=0cnt=0cnt=0,直接套用 A 的算法即可,毕竟一条欧拉回路也是一条欧拉道路。
- 若 cnt=2cnt=2cnt=2,则我们将两个度数为奇数的点 u,vu,vu,v 连起来,构造出一条欧拉回路;最后,我们将边 (u,v)(u,v)(u,v) 删去,断环为链,得到了一条欧拉道路。
更进一步的,若 cnt=4,6,⋯cnt=4,6,\cdotscnt=4,6,⋯,我们均可以类比上述做法——将度数为奇数的点两两配对,构造出一条欧拉回路,然后将我们自己添加进去的边一一删去,将环断为若干条链,从而构造出了一组边集的最小链覆盖。
时间复杂度 O(n+m)O(n+m)O(n+m)。


1714

被折叠的 条评论
为什么被折叠?



