文章目录
一、中国邮递员问题
中国邮递员问题(Chinese Postman Problem, CPP)是图论中的一个著名问题,它是在1960年由我国学者管梅谷首先提出并研究的。简单来说,就是问:一个邮递员从邮局出发,把一个城市的所有街道都至少走一遍,最后回到邮局,问怎样使他走的总路程最小?这个问题有许多现实的应用,比如一个除雪车从城市的某一位置出发,把城市里所有街道的雪都清扫了,再回到出发点,问怎么走路程最少。我们可以把城市看作一个连通的、简单的带权无向图,节点代表街道的交叉,边代表街道,其权重是街道的长度。一个回路(circuit)是从某一点出发回到这一点的路径,并且可以将一条边经过多次。所以,中国邮递员问题就是求无向图上权重最小(即最短)的回路。
1. 与欧拉回路的关系
说到回路,我们肯定会想起欧拉回路(Eulerian circuit),它是在一个无向图中能够访问所有边恰好一次的回路(即“一笔画”)。显然,一个图如果含有欧拉回路,那欧拉回路就是邮递员的最佳路径了(因为他只用把每条边访问一次)。一个连通图有欧拉回路当且仅当所有节点的度数都为偶数。如果这个条件不满足,那么图中就没有欧拉回路,这时邮递员就必须把某些边访问两次及以上。也就是说,我们要在图中找到一些边,把它们复制,使得得到的多重图有欧拉回路,并且这些被复制的边的权重之和最小。
2. Edmonds-Johnson算法
管梅谷解决这个问题的方法是“奇偶点图上作业法”,但是复杂度太高,我们这里介绍复杂度更优的Edmonds-Johnson算法。首先,会“坏事儿”的节点就是图上具有奇度数的节点(称为奇节点,度数为偶数的叫偶节点),我们必须给每个奇节点复制一条(从它开始的)边。当图上所有节点都是偶节点时,才有欧拉回路。其次,我们可以看出,每条边至多被复制一次(也就是被邮递员经过两次),因为如果复制两次及以上,邮递员相当于要从这头走到那头又回来,白走了很多路程。或者说,至多复制一次就可以让一个奇节点变成偶节点,所以没必要复制更多次。
我们还可以观察到,一个无向图中奇节点的个数一定是偶数。为什么呢?握手引理(Handshaking Lemma)说的是:无向图中所有节点的度数之和等于边数乘2,那么度数之和和一定是偶数。而只有偶数个奇数之和才能是偶数,所以奇节点一定有偶数个。好了,现在我们假设图中有 2 m 2m 2m个奇节点,它们组成的集合为 S = { v 1 , v 2 , ⋯ , v 2 m } S=\{v_1,v_2,\cdots,v_{2m}\} S={ v1,v2,⋯,v2m}。我们考虑把 v 1 v_1 v1变成偶节点,那么需要把一条从 v 1 v_1 v1出发的边复制一份。假设这条边为 ( v 1 , u ) (v_1,u) (v1,u), u u u本来是偶节点,把它复制一份, v 1 v_1 v1确实变成了偶节点,但 u u u又变成奇节点了。接着又得把 u u u再变成偶节点,假设我们把 ( u , h ) (u,h) (u,h)复制一份, u u u变偶, h h h变奇,再把 ( h , l ) (h,l) (h,l)复制一份, h h h变偶, l l l变奇,……什么时候才能结束呢?直到遇到另一个 S S S中的节点 v x v_x vx(即本来度数为奇数的节点),使得 v x v_x vx从奇变偶了,才能结束。(如果 v 1 v_1 v1本来就和某个奇节点 v x v_x vx相邻,那么只需要把 ( v 1 , v x ) (v_1,v_x) (v1,vx)复制一份即可。)其实我们发现,我们把 v 1 v_1 v1到 v x v_x vx的路径都复制了一份,使得 v 1 v_1 v1、 v x v_x vx的度数+1,中间节点的度数+2,那么这条路径上的所有节点都变成偶节点了。注意,我们想要增加的边的权重之和最小,那我们复制的一定是从 v 1 v_1 v1到 v x v_x vx的最短路,而不是其他更长的路径。 v 1 ( 奇 ) ⟶ u ⟶ h ⟶ l ⟶ ⋯ ⟶ v x ( 奇 ) v_1(\text{奇})\longrightarrow u\longrightarrow h\longrightarrow l\longrightarrow\cdots\longrightarrow v_x(\text{奇}) v1(奇)⟶u⟶h⟶l⟶⋯⟶vx(奇)好了,我们现在知道,把两个奇节点 v i v_i vi和 v j v_j vj之间的路径复制一份,可以把 v i v_i vi和 v j v_j vj都变成偶节点,花费的代价是 v i v_i vi和 v j v_j vj之间的最短距离(即最短路长度)。我们定义:如果把 v i v_i vi到 v j v_j vj的最短路径复制了一份,则称 v i v_i vi和 v j v_j vj配对。一个奇节点只能和另外的一个奇节点配对,因为如果和两个奇节点配对的话,那它的度数加2,它还是奇节点。(如果和三个奇节点配对,设这三个奇节点为 v x , v y , v z v_x,v_y,v_z vx,vy,vz,那么可以视为它和 v x v_x vx配对, v y v_y vy通过它和 v z v_z vz配对。以此类推。)于是,这个问题就变成了一个最小权匹配问题。至此,Edmonds-Johnson算法也就逐渐浮出水面了。
Edmonds-Johnson算法的步骤是:
- 对于连通的无向简单图 G = ( V , E ) G=(V,E) G=(V,E)(邮局在哪里其实没有关系),设 S = { v 1 , v 2 , ⋯ , v 2 m } S=\{v_1,v_2,\cdots,v_{2m}\} S={ v1,v2,⋯,v2m}是其中度数为奇数的节点。对于 S S S中任意的节点对 ( v i , v j ) (v_i,v_j) (vi,vj),计算它们的最短路径长度 l i j l_{ij} lij。这一步可以由Floyd全源最短路算法完成。
- 建立一个带权无向完全图 K 2 m K_{2m} K2m,其节点集是 S S S,每对节点 v i , v j v_i,v_j vi,vj之间都有边,边权是 G G G中 v i , v j v_i,v_j vi,vj的最短路径 l i j l_{ij} lij。接着,我们需要找到 K 2 m K_{2m} K2m的最小权完美匹配 M M M, M M M是由 m m m条边组成的集合,其中任两条边之间没有公共端点。(“完美”匹配指的是每个奇节点都有与之配对的节点。)寻找最小权完美匹配的过程可以由Edmonds算法在 O ( n 3 ) O(n^3) O(n3)的时间内完成( n n n为 G G

本文详细介绍了中国邮递员问题,探讨了它与欧拉回路的关系以及如何通过Edmonds-Johnson算法求解。同时,文章阐述了平面图上的最大割问题,包括其NP完全性,以及如何将最大割问题转换为最小权匹配问题。最后,讨论了顶点图上最大割问题的NP完全性,展示了平面图与顶点图在这些问题上的复杂性差异。
最低0.47元/天 解锁文章
366

被折叠的 条评论
为什么被折叠?



