欧拉回路与道路 详解

A

Description

给定一个包含 nnn 个点,mmm 条边的有向图。

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

1≤n,m≤1061 \le n,m \le 10^61n,m106

Solution

degudeg_udegu 表示节点 uuu度数

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

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

考虑执行下面的流程:

  • 先将 111 压入队列。
  • 每次取出队顶,令队顶节点为 uuu
    • 找到 uuu 第一条往外的未被经过的边 u→vu \to vuv,将 vvv 压入队尾;同时,我们也要将 headuhead_uheadu 修改为 u→vu \to vuv 的下一条边以保证复杂度正确(可以理解为 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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值