欧拉回路与道路 详解

A

Description

给定一个包含 n n n 个点, m m m 条边的有向图。

你需要规划出一条经过每条边恰好一次的欧拉回路

1 ≤ n , m ≤ 1 0 6 1 \le n,m \le 10^6 1n,m106

Solution

d e g u deg_u degu 表示节点 u u u度数

首先,有解当且仅当 ∀ i ∈ [ 1 , n ] \forall i \in [1,n] i[1,n] 满足 d e g i deg_i degi 为偶数,且整个图形成了一个大连通块。

接着,我们考虑构造出一组合法解。

考虑执行下面的流程:

  • 先将 1 1 1 压入队列。
  • 每次取出队顶,令队顶节点为 u u u
    • 找到 u u u 第一条往外的未被经过的边 u → v u \to v uv,将 v v v 压入队尾;同时,我们也要将 h e a d u head_u headu 修改为 u → v u \to v uv 的下一条边以保证复杂度正确(可以理解为 Dinic 中的 ⌈ \lceil 当前弧优化 ⌋ \rfloor )。
    • 若这样的边找不到,则 u u u 已无法往外扩展;于是弹出队顶,并将 u u u 压入存放答案的序列中。

时间复杂度 O ( m + n ) O(m+n) O(m+n)

B

Description

给定一个包含 n n n 个点, m m m 条边的有向图。

你需要规划出一条经过每条边恰好一次的欧拉道路

Solution

d e g u deg_u degu 表示节点 u u u度数

首先,有解当且仅当 c n t = ∑ i = 1 n [ d e g i  mod  2 = 1 ] ≤ 2 cnt=\sum_{i=1}^n [deg_i \ \text{mod} \ 2=1] \le 2 cnt=i=1n[degi mod 2=1]2,且整个图形成了一个大连通块。

考虑将 B 转化为 A。

  • c n t = 0 cnt=0 cnt=0,直接套用 A 的算法即可,毕竟一条欧拉回路也是一条欧拉道路。
  • c n t = 2 cnt=2 cnt=2,则我们将两个度数为奇数的点 u , v u,v u,v 连起来,构造出一条欧拉回路;最后,我们将边 ( u , v ) (u,v) (u,v) 删去,断环为链,得到了一条欧拉道路。

更进一步的,若 c n t = 4 , 6 , ⋯ cnt=4,6,\cdots cnt=4,6,,我们均可以类比上述做法——将度数为奇数的点两两配对,构造出一条欧拉回路,然后将我们自己添加进去的边一一删去,将环断为若干条链,从而构造出了一组边集的最小链覆盖。

时间复杂度 O ( n + m ) O(n+m) O(n+m)

猜你喜欢

转载自blog.csdn.net/Cherrt/article/details/121414469
今日推荐