实用算法实现-第 18 欧拉回路

 

18.1    欧拉回路存在性的判断

欧拉回路问题可以分为无向图中的欧拉回路和欧拉通路,有向图中的欧拉回路和欧拉通路。这几个问题大抵相像。

有向欧拉回路有:

定理:假设有像多重图D有性质:当忽略有向边上的方向时,得到的图是连通的,那么D有有向欧拉回路当且仅当D的每个顶点的入度和出度相等。

类似的,对有向欧拉通路有:

定理:D有有向欧拉通路,当且仅当除两个不同顶点B和C之外,D的其它顶点的入度和出度相等,且B的出度比入度大1,C的入度比出度大1。在这种情况下,有向欧拉通路自B出发,至C终止。

由上面的定理可以知道,如果要判断一个有向图的欧拉回路是否存在,需要先判断连通性,再判断出度入度。对于无向图,判断方法类似。

判断连通性可以通过DFS或者并查集来实现。

18.2    欧拉回路的构建

在构建欧拉回路之前需要判断欧拉回路是否存在。

构建欧拉回路可以使用Fleury算法。Fleury算法要求能不走桥就不走桥:

1. 任取v0∈V(G),令P0=v0。

2. 设Pi=v0e1v1e2…eivi已经行遍,按下面方法来从E(G)-{e1,e2,…,ei}中选取ei+1:

a) ei+1与vi相关联;

b) 除非无别的边可供行遍,否则ei+1不应该为Gi=G-{e1,e2,…,ei}中的桥。

3. 当2.不能再进行时,算法停止。

构建欧拉回路的Fleury算法可以实用DFS来实现。

《离散数学》中还介绍了另一种构建欧拉回路的算法,就是任意遍历图,直到形成回路,在回路中选择还与不在回路中的点连接的任意点作为起点,再次遍历余下的图,直到形成回路,将找到的新回路加入原来的回路中。如此反复,直到所有的点都已经包含在回路中。这种算法相比Fleury算法较难控制回路的生成,例如下面的例子似乎就不适合用这种方法解决。

18.2.1    实例

PKU JudgeOnline, 2337, Catenyms.

18.2.2    问题描述

给出一些字符串,判断是否能形成欧拉回路。如果不能,输出“***”。否则输出字典序最小的回路。

18.2.3    输入

2

6

aloha

arachnid

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值