码迷,mamicode.com
首页 > 其他好文 > 详细

欧拉回路

时间:2017-09-17 20:54:27      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:注意   ora   comm   生命力   如图所示   png   网络   mon   混合图欧拉回路   

欧拉回路

  对于图 $G = (V, E)$ , 若存在一条回路 $P$ , 经过所有边有且仅有一次, 则成 $P$ 为 $G$ 的一条欧拉回路, $G$ 称为欧拉图.

  对于图 $G = (V, E)$ , 若存在一条路径 $P$ , 经过所有边有且仅有一次, 则称 $P$ 为 $G$ 的一条欧拉路径, $G$ 称为半欧拉图.

  如图所示, 路径 $1 \rightarrow 2 \rightarrow 3 \rightarrow 1$ 就是一条欧拉回路.

  技术分享

  上述的定义有几个值得注意的地方:

  ① 欧拉图 $G$ 不一定要连通, 因为可能有孤立点的存在, 例如上图的 4 号点. 我们通常排除掉孤立点来考察这张图.

  ② 注意 $G$ 可能是无向图, 可能是有向图, 也可以是混合图.

  在上述的概念中, 最为核心的概念是欧拉回路, 这在之后会有所体现.

 

  给出了欧拉回路的相关定义之后, 我们应该要有所追求地给自己几个小小的探究目标.

  对于一般的探究思路, 我们要依次研究存在性, 个数, 求任意解层次的问题.

  在欧拉图中, 存在性层次就包括了欧拉图的判定, 与构造欧拉回路的方法; 个数层次就是求解欧拉回路的个数, 在本文中忽略.

 

欧拉图的判定

  我们考虑先探究 $G$ 为无向图时的情况.

  当无向图 $G$ 为欧拉图时, $G$ 明显是连通图. 而且注意到每个点的一条入边与一条出边相对应, 所以所有点的度数都为偶数.

  于是我们得到了这样一个结论: 无向图 $G$ 为欧拉图 $\Rightarrow$ $G$ 连通, 且任意一个点的度数为偶数.

  我们猜测 "$G$ 连通, 且任意一个点的度数为偶数" 不仅是必要条件, 而且也是充分条件.

  经过大量地实验, 我们发现似乎真的是如此.

  定理1 (无向欧拉图判定定理)

    无向图 $G$ 为欧拉图 $\Leftrightarrow$ $G$ 为连通图, 且所有点的度数为偶数.

  证明

  由上述的推导过程, 我们知道必要性显然. 下面证明充分性, 即 " 无向图 $G$ 为欧拉图 $\Leftarrow$ $G$ 连通, 且任意一个点的度数为偶数. "

  假设 $G$ 中不存在回路, 又因为 $G$ 连通且不存在孤立点, 所以 $G$ 是一棵树, 所以 $|E| = |V| - 1$ . 由于 $G$ 为连通图,  且所有点的度数为偶数, 所以 $\forall i \in V, d_i \ge 2$ . 根据边数与度数的关系, $|E| = \frac{1}{2} \sum_{k \in V} d_k \ge |V|$ , 这与 $|E| = |V| - 1$ 矛盾. 所以 $G$ 中一定存在回路.

  不妨设 $G$ 中最长的回路为 $C$ , 下面尝试证明 $C$ 为欧拉回路, 也即无向图 $G$ 为欧拉图. 假设 $C$ 不是欧拉回路, 设删去欧拉回路中的边后, 得到的新图为 $G‘ = (V, E‘)$ , 那么 $E‘$ 并非空集. 由于 $G$ 是连通图, 所以新图中至少存在一条边 $e \in E‘$ , 满足欧拉回路 $C$ 中的一个节点 $u$ 是 $e$ 的一端. 我们过边 $e$ 一定可以找到一条回路, 因为每个点的度数为偶数, 只有到度数为 0 , 即回到点 $u$ 才会停止. 我们发现, 可以把 $C$ 和新的回路进行合并, 进而说明 $C$ 不是最长的回路, 所以矛盾.

  综上所述, 无向图 $G$ 中一定存在最长的回路 $C$ , 且 $C$ 就是欧拉回路.

 

  与欧拉图类似的概念是半欧拉图, 我们根据定理1, 可以轻松地推广到无向半欧拉图判定定理.

  定理2 (无向半欧拉图判定定理)

    无向图 $G$ 为半欧拉图 $\Leftrightarrow$ $G$ 为连通图, 存在有且仅有两个点 $u, v$ 的度数为奇数, 其余点的度数为偶数.

  证明

  必要性显然, 下面证明充分性.

  我们在 $u, v$ 间连接一条虚拟边, 构建新图 $G‘$ , 那么 $G‘$ 为连通图, 且所有点的度数为偶数. 根据定理1, 图 $G‘$ 一定存在欧拉回路 $C$ . 我们再将 $C$ 中的边 $(u, v)$ 去掉, 即可得到无向图 $G$ 的一条欧拉路径, 所以无向图 $G$ 为半欧拉图.

 

  我们研究完了无向欧拉图的相关判定, 现在考虑研究有向图的相关判定.

  照葫芦画瓢, 我们可以得到有向图的两个判定定理.

  定理3 (有向欧拉图判定定理)

    有向图 $G$ 为欧拉图 $\Leftrightarrow$ $G$ 的基图连通, 且所有点的入度与出度相等.

  定理4 (有向半欧拉图判定定理)

    有向图 $G$ 为半欧拉图 $\Leftrightarrow$ $G$ 的基图连通, 存在点 $u, v$ , $u$ 的入度比出度大 $1$ , $v$ 的入度比出度小 $1$ , 其余点的入度与出度相等.

 

  最后考虑判定混合图是否是欧拉图.

  大家可以参考这一篇博文: http://blog.csdn.net/commonc/article/details/52442882 .

  混合图欧拉回路:

  1. 如果基图不连通, 或者基图的某个点的度数不是偶数, 那么不可能是欧拉图.

  2. 我们尝试将所有的无向边进行定向, 问是否存在某种方案, 使得每个点的入度与出度相同.

    先将所有的无向边任意定向, 记每个点的入度与出度之差为 $d[1], d[2], ..., d[n]$ .

  3. 建立源点 $S$ , 汇点 $T$ .

    对于点 $i$ , 若 $d[i] > 0$ , 那么连边 $(i, T, \frac{d[i]}{2})$ .

    对于点 $i$ , 若 $d[i] < 0$ , 那么连边 $(S, i, -\frac{d[i]}{2})$ .

    对于定向的无向边 $(u, v)$ , 连边 $(u, v, 1)$ .

  4. 跑网络流, 若没有满流, 则无解.

  5. 把流满的边进行反向, 得到新图 $G‘$ , 对 $G‘$ 求欧拉回路.

  $S$ 到 $T$ 的一条增广路的意义, 就是将路径上的所有边进行反向, 这样的影响是起点的出度-1, 入度+1, 终点的入度-1, 出度+1. 如果满流, 那么相当于完成了调整, 每个点的入度等于出度, 进而就有欧拉回路了.

  最终, 混合图欧拉回路问题被转化为了有向图欧拉回路问题.

 

求欧拉回路

  接下来, 考虑如何求出一条欧拉回路.

 

  我们尝试 DFS 来找出欧拉回路, 并先观测一些小的情况.

    技术分享

  我们猜测可以从某个点开始 DFS , 贪心地选择每条边加入欧拉回路中?

  不幸的是, 我们假如访问的顺序是 1 - 2 - 3 - 1 , 那么下面的环 3 - 4 - 5 - 6 - 7 - 3 就会被忽略掉.

  这不要紧, 我们尝试列出完整的搜索序列: 1 - 2 - 3 - 1 - 4 - 5 - 6 - 7 - 3 . 我们发现, 虽然正着选取是不行的, 但是倒序得到的就是一个从点 3 开始出发的欧拉回路.

  经过大量地实验, 我们可以猜测证明这是一个有生命力的一般性方法.

 

  总之, 对于无向图, 我们的做法是: 从某个点开始 DFS , 访问没有访问的边, 将所有访问的边逆序加入 C 中, C 即为原图的欧拉回路.

  那么, 对于有向图来说, 我们只需要对有向图的逆图执行上述算法即可.

欧拉回路

标签:注意   ora   comm   生命力   如图所示   png   网络   mon   混合图欧拉回路   

原文地址:http://www.cnblogs.com/Sdchr/p/7533244.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!