欧拉环游和中国邮递员问题

前言

这篇文章介绍了欧拉环游的定义判定,Fleury算法求欧拉图中的欧拉环游,最后给出了中国邮递员问题的解决步骤。

欧拉环游

所谓欧拉环游就是指在一个无向图中,从一个点出发,每条边恰好走一次并且能够回到原点的路径。举个例子,下图中路径ABCD就是一个欧拉环游。这种包含了欧拉环游的图叫欧拉图。

图1 一个欧拉图

那么,给定一个图,我们应该怎么判定它是否是欧拉图呢?很简单。
非 空 连 接 图 G 是 欧 拉 图 ⇔ 所 有 顶 点 的 度 为 偶 数 \color{red}非空连接图G是欧拉图\Leftrightarrow所有顶点的度为偶数 G。这里不作证明。

Fleury算法

那么给定一个欧拉图,我们应该如何求欧拉环游呢?这里有一种Fleury算法,可以求解。Fleury算法很简单,简单概括就是过河拆桥,尽量不走独木桥

算法流程:

  1. 任取一个顶点 v 0 v_0 v0,令 w 0 = v 0 w_0 = v_0 w0=v0

  1. w i = v 0 e 1 v 1 . . . e i v i w_i = v_0e_1v_1...e_iv_i wi=v0e1v1...eivi已经确定,在图中拆除路中出现的边,选择一条边 e i + 1 e_{i+1} ei+1使得
    • 边 e i + 1 和 v i 边e_{i+1}和v_i ei+1vi相连
    • 除非无奈,否则不要图的割边 e i e_i ei(除去这条边后图会变成两个不连通的图)

  1. 如果选不出 e i + 1 e_{i+1} ei+1,结束。否则得到路 w i + 1 = v 0 e 1 v 1 . . . e i v i w i + 1 v i + 1 w_{i+1 }= v_0e_1v_1...e_iv_iw_{i+1}v_{i+1} wi+1=v0e1v1...eiviwi+1vi+1 e i + 1 e_{i+1} ei+1连接 v i v_i vi v i + 1 v_{i+1} vi+1,转到2。

算法复杂度:
设顶点个数为 v v v,边数为 ϵ \epsilon ϵ,那么算法复杂度为 O ( v 2 ϵ ) O(v^2\epsilon) O(v2ϵ)遍历每条边,并且判断这条边是否为割边,判断一条边是否为割边复杂度为 O ( v 2 ) O(v^2) O(v2),所以该算法的算法复杂度为 O ( v 2 ϵ ) O(v^2\epsilon) O(v2ϵ)

算法图解:

图2 算法图解

中国邮递员问题

讲了半天欧拉环游,接下来我们讲讲它的使用例子。我国数学家管梅谷中国邮递员问题(Chinese postman problem, cpp)。一个邮递员从邮局出发,走完所有他所管辖街道各一次,最后返回邮局,如何选择一条最短路线。这是个求最优环游问题(遍历所有边回到原点并且边权重和最小),我们可以把这个问题转换为欧拉环游问题。

  • 假如图G是欧拉图,那么图G任意欧拉环游都是最优环游
  • 假如图G不是欧拉图,则某些边必须被多次经过。我们可以将这条边多复制几条,变成多重边。这样中国邮递员就与下面问题等价。
  1. 添加重复边,从原来的图中生成欧拉图,并且使得添加的边权重和最小。
  2. 求欧拉环游。

管梅谷证明,一条边最多被重复走两次。

这里直接给出求解中国邮递员问题的步骤:

  1. 找出图 G G G中邻接边为奇数的顶点,将这些邻接边为奇数顶点两两配对,将连通两者的路径上面的边都改为加上一条重复边。
  2. 若某对结点间有多于两条边连接,则去掉其中偶数条边,留下一条或两条边连接这两个结点,直到每对相邻结点至多由2条边连接。
  3. 检查每个圈 C C C,若某个圈 C C C上重复边集 E E E的权和超过这个圈的权和的一半,则将 C C C中原来的重复边去除,将原来的没有重复边的边加上重复边,直到所有的圈其重复边的权和不超过此圈权和的一半
  4. 用Fleury算法求欧拉回路。

参考视频
算法图解

图3 中国邮递员算法图解
  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值