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