欧拉图 Eulerian Graphs
定义
如果存在一条包含图 G G G 中每一条边的封闭的迹 trail,则连通图 G G G 是欧拉图 。这样的迹是一条欧拉迹(Eulerian Trail)。
- 注意,这个定义要求每条边恰好被遍历一次。回顾:迹要求所有边都不同。
- 且迹是封闭的!即从一个顶点出发,沿着边行走,最终回到起始顶点,且每条边恰好经过一次。
如果一个图不是欧拉图 ,但存在一条迹包含图 G G G 的每一条边 ,该图 G G G 是半欧拉图(semi-Eulerian)。
- 半欧拉图 的迹不一定是封闭的!即不要求回到起始顶点。
注:半欧拉图中的迹也可以叫欧拉路径 ,即每条边恰好被遍历一次的路径;而欧拉迹也可以叫欧拉回路。
应用
欧拉图定义有助于区分不同类型的图在边遍历特性上的差异,在研究图的性质和解决相关问题(如路径规划、网络遍历等)中有重要作用。例如在物流配送路线规划中:
- 如果配送区域的道路图是欧拉图 ,就可以找到一条遍历所有道路且不重复的最优路线;
- 如果是半欧拉图 ,也能找到经过所有道路但可能需要额外考虑起始和结束点不同的较优路线;
- 而对于非欧拉图 ,则需要更复杂的策略来处理路径规划问题。
欧拉图的判定
如何找到欧拉图?如何证明一个图是欧拉图?一个图是欧拉图的充分必要条件是什么?
引理6.1:如果图 G G G 中每个顶点的度数至少为 2,那么图 G G G 包含一个圈。
证明:
- **选择起始顶点:**假设 G G G 是一个简单图,设 v 0 v_0 v0 是 G G G 的任意一个顶点,选择该顶点 v 0 v_0 v0 为起始顶点。
- 构建路径 :从 v 0 v_0 v0 开始,沿着边移动到一个相邻顶点 v 1 v_1 v1。由于每个顶点的度数至少为2, v 1 v_1 v1 至少有一个除了 v 0 v_0 v0 之外的邻居。继续添加邻居 ,归纳构建一条路径 v 0 → v 1 → v 2 → ⋯ v_0\to v_1\to v_2\to\cdots v0→v1→v2→⋯,使得对于所有的 i i i, v i v_i vi 都与 v i + 1 v_{i+1} vi+1 相邻。
- 检查重复顶点 :由于图是有限的,这个过程最终肯定会出现重复顶点 。假设 v k = v j v_k = v_j vk=vj ( k > j k > j k>j)。这意味着有一个循环 v j → v j + 1 → ... → v k v_j\to v_{j+1}\to \ldots\to v_k vj→vj+1→...→vk。
- 形成圈 :循环 v j , v j + 1 , ... , v k v_j, v_{j+1}, \ldots, v_k vj,vj+1,...,vk 形成了一个圈。如果 j = 0 j = 0 j=0,那么圈就是 v 0 → v 1 → ... → v k v_0\to v_1\to \ldots\to v_k v0→v1→...→vk。如果 j > 0 j > 0 j>0,那么圈是 v j → v j + 1 → ... → v k v_j\to v_{j+1}\to \ldots\to v_k vj→vj+1→...→vk。
- 这个证明依赖于图的有限性 和每个顶点至少有两个邻居的事实,这保证了我们可以无限期地构建路径,直到我们遇到一个重复的顶点,从而形成一个圈。
定理6.2(欧拉,1736):一个连通图 G G G 是欧拉图当且仅当 G G G 的每个顶点的度数都是偶数。
- 注意该定理的前提是图 G G G 是连通图
证明:
- 证充分性:一个连通图是欧拉图 ⇒ 该连通图的每个顶点度数都是偶数
- 假设 P P P 是图 G G G 的一条欧拉迹。
- 每当 P P P 经过一个顶点时,这个顶点的度数就会增加 2 2 2。
- 由于每条边在 P P P 中恰好出现一次 ,所以每个顶点的度数一定是偶数。
- 证必要性:一个连通图的每个顶点度数都是偶数 ⇒ 该连通图是欧拉图(运用对边数的数学归纳法)
- 归纳假设:假设对于 任何边数少于 G G G 的图,若每个顶点的度数都是偶数,则该图是欧拉图。
- 存在圈 C C C:由于 G G G 是连通的,每个顶点的度数至少为 2 2 2,所以根据引理6.1 ,G G G 包含一个圈 C C C 。
- **圈 C C C 包含所有边:**如果 C C C 包含了 G G G 的每一条边,那么 G G G 就是一个欧拉图,证明完成。
- 圈 C C C 不包含所有边:从 G G G 中移除 C C C 的边以形成一个新的可能不连通的图 H H H。
- H H H 的边数比 G G G 少,并且其中每个顶点的度数仍然是偶数。
- 应用归纳假设:由于图 H H H 的边数比 G G G 少,根据归纳假设, H H H 的每个连通分量都有一条欧拉迹。
- 连通性:由于 H H H 的每个连通分量 都与 C C C 至少有一个共同顶点 ,可以从 C C C 开始构建 G G G 的欧拉迹。
- 通过沿着圈 C C C 的边前进直到到达 H H H 的一个非孤立顶点,假设该顶点为起始顶点 v 0 v_0 v0 ,追踪包含该顶点的 H H H 的连通分量 的欧拉迹,这样就可以再次回到该顶点 v 0 v_0 v0,即再次回到 C C C。
- 然后继续沿着 C C C 的边前进直到到达 H H H 的另一个连通分量 的一个顶点 v 1 v_1 v1,依此类推。
- **构建欧拉迹:**上述过程会一直进行,直到最后回到初始起点 v 0 v_0 v0,这样就可以得到图 G G G 的一条欧拉迹。
- 当回到初始起点时,就证明了图 G G G 是一个欧拉图。
推论6.3:一个连通图是欧拉图当且仅当它的边集可以被分割成互不相交的圈。
证明:
- 充分性(边集可分割成互不相交的圈⇒图是欧拉图) :
- 假设连通图 G G G 的边集可以被分割成互不相交的圈 C 1 , C 2 , ⋯ , C k C_1,C_2,\cdots,C_k C1,C2,⋯,Ck。
- 对于每个圈 C i C_i Ci,我们可以从任意一个顶点开始沿着圈走一圈,由于圈的性质,每条边恰好经过一次,且回到起始顶点,这样就得到了一条欧拉迹。
- 因为这些圈是互不相交 的,所以将这些圈的欧拉迹依次连接起来 (因为图是连通的,这些圈之间有公共顶点 可以连接),就可以得到一条包含图 G G G 所有边的欧拉迹,所以 G G G 是欧拉图。
- 必要性(图是欧拉图⇒边集可分割成互不相交的圈) :
- 已知 G G G 是欧拉图,根据定理6.2,连通图 G G G 是欧拉图当且仅当每个顶点的度数为偶数。
- 从任意顶点 u u u 出发,沿着欧拉迹走,由于每个顶点度数为偶数,所以当我们从一个顶点进入并遍历完与它相连的边后,一定可以从另一条未走过的边离开这个顶点 ,这样就形成了一个圈 C 1 C_1 C1。
- 从 G G G 中去掉圈 C 1 C_1 C1 的边 ,得到的子图 G 1 G_1 G1 仍然是每个顶点度数为偶数(因为去掉一个圈,每个顶点的度数减少偶数条边)。
- **如果 G 1 G_1 G1 为空:**则说明该欧拉图只有一个圈 C 1 C_1 C1,这个圈包含了图中所有的边。
- 如果 G 1 G_1 G1 非空:再从 G 1 G_1 G1 中选择一个顶点,重复上述过程,又可以得到一个 圈 C 2 C_2 C2。
- 继续这样做,直到所有边都被包含在这些圈中,这样就将 G G G 的边集分割成了互不相交的圈。
推论6.4:一个连通图是半欧拉图当且仅当它恰有两个度数为奇数的顶点。
-
在一个半欧拉图中,任何半欧拉迹都必须以一个度数为奇数的顶点作为起始顶点 ,以另一个度数为奇数的顶点作为终点。
-
根据握手引理 ,一个图不可能恰好有一个度数为奇数的顶点(度数为奇数的顶点个数必然是偶数)。
证明:
- 充分性(恰有两个度数为奇数的顶点⇒图是半欧拉图):
- 设连通图 G G G 恰有两个度数为奇数的顶点 u u u 和 v v v。
- 在图 G G G 中添加一条连接 u u u 和 v v v 的边 e e e ,得到新图 G ′ G' G′。
- 此时 G ′ G' G′ 中所有顶点的度数都为偶数,因为 u u u 和 v v v 的度数加 1 后变为偶数,其他顶点度数不变仍为偶数。
- 根据定理6.2,连通图 G ′ G' G′ 是欧拉图,即存在一条包含 G ′ G' G′ 所有边的封闭的欧拉迹 T T T。
- 从 T T T 中去掉添加的边 e e e,就得到了一条从 u u u 到 v v v 的包含 G G G 所有边的迹,但不封闭,所以 G G G 是半欧拉图。
- 必要性(图是半欧拉图⇒恰有两个度数为奇数的顶点):
- 已知 G G G 是半欧拉图,则存在一条从顶点 u u u 到顶点 v v v 的包含 G G G 所有边的迹 T T T。
- 考虑 G G G 中除 u u u 和 v v v 外的任意顶点 w w w,在迹 T T T 中,进入 w w w 的次数和离开 w w w 的次数相等 ,所以 w w w 的度数为偶数。
- 而对于顶点 u u u 和 v v v,在迹 T T T 中,u u u 作为起点有一条边出去, v v v 作为终点有一条边进来 ,并且除了这两条边外,进入 u u u 和离开 v v v 的次数也相等 ,所以 u u u 和 v v v 的度数为奇数 ,即 G G G 恰有两个度数为奇数的顶点。
寻找欧拉迹
弗勒里算法:在给定欧拉图中寻找欧拉迹的算法,或者在给定的半欧拉图中寻找包含所有边的迹。
弗勒里算法的核心 在于选择边的过程中避免过早地使用桥(桥即移除后会使图断开的边),以确保可以继续寻找欧拉迹直到所有边都被访问。
定理6.5:设 G G G 是一个欧拉图。那么下面的构造总是可行的,并且能产生 G G G 的一条欧拉迹。
- 从任意一个顶点 u u u 开始 ,以任意方式遍历边,但仅需遵循以下规则:
- 在遍历边的时候去除这些边,如果产生了任何孤立顶点,也将它们去除;
- 在每个选择边的阶段,优先选择非桥的边 ,只有在没有其他选择的情况下才遍历桥。
其实这个算法就是在告诉我们找欧拉迹的过程,如下图所示:
证明:首先证明在每个阶段这个构造都是可行的,也就是证明弗勒里算法在每一步都能选择一条边来构造欧拉迹。
- 当前顶点 v v v :假设从起点 u u u 出发,在算法执行过程中到达了一个顶点 v v v。
- 非起点情况( v ≠ u v≠u v=u) :
- 如果 v v v 不是起点 u u u,那么移除边后剩下的子图 H H H 仍然是连通的 ,并且子图中只有两个顶点 u u u 和 v v v 的度数是奇数。
- 为了证明算法可以在这一步继续进行,我们需要证明移除下一条边不会使 H H H 断开,或者说, v v v 至多与一条桥相邻。
- 反证法:
- 如果 v v v 与多于一条桥 相邻,那么存在一条桥 v w vw vw,使得在移除 v w vw vw 后,包含 w w w 的 H − v w H−vw H−vw 的连通分量 K K K 不包含 u u u。
- 由于 w w w 在 K K K 中的度数是奇数,根据半欧拉图的性质, K K K 中必须有另一个顶点的度数也是奇数,这与 u u u 和 v v v 是 H H H 中仅有的两个奇数度数顶点的事实相矛盾。
- 起点情况( v = u v=u v=u) :
- 如果 v v v 是起点 u u u,证明几乎是一样的,只要 u u u 还有与之相邻的边。
- 只要 u u u 还有未被访问的边,算法就可以继续进行,因为 u u u 也不会与多于一条桥相邻,否则同样会产生与非起点情况相同的矛盾。