题意:经典中国邮递员问题。给定一个连通图,顶点之间可能有若干条边,要求从任意一点出发,遍历所有的边,每条边至少访问一次,再回到起点。求满足要求的方案中走过的距离之和的最小值。
思路(http://www.cnblogs.com/wuminye/archive/2013/05/06/3063902.html):
首先想到的是如果这是一个欧拉图,那肯定能经过每条边有且仅有一次,这样的方案一定是最小的(所有边距离的和)。如果不是欧拉图,由于是连通图,根据握手定理,则必有偶数个点的度为奇数。要从一点出发每边至少走一次,则必须要构成一个欧拉回路,所以有些边必须要走多次,每多走一次等价多连接了一条边,这样构成欧拉图,原先的边和新加的虚拟边在欧拉图中有且仅经过一次。现在还要使距离之和最短。原先的边的距离之和是固定的了,要使结果最小,只能使新加的虚拟边之和最小。通过分析可以发现要构成欧拉图,添加的虚拟边的两个端点原先的度数一定是奇数,如果其中有偶数度的点,添加一边后度数就会变奇数,不可能成为欧拉图或者多此一举。于是现在的问题是如何在偶数个奇度顶点中两两连线,使得这些连线的距离之和最小,易想到两个顶点的连线长度应该是这两点间的最短距离(贪心)。想要解决这个问题,可以使用最优匹配算法,也可以使用动态规划。
这里我使用动态规划的方法。
状态表示:
用一串二进制数,第i位数表示第i个点是否为奇度点,0表示不是,1表示是。例如00110101表示1、3、5、6点的度数为奇数。
每个状态划分为一个阶段。
阶段状态转移:
每个状态可以从当前状态任意使两个1变为0 的状态转移而来,也就是说从删除一条边变为当前状态的状态转移而来。
比如说00110101可以从6个状态转移而来:00000101、00110000、00010001、00100001、00010100、00100100
无后效应:
如果当前状态是通过之前的一条转移路径转移而来,不会导致之后有些本该转移的状态不可转移。
例如:当前为00110101,无论之前如何转移,之后一定可以转移成00111111
最优子结构:
当

本文探讨了如何运用Floyd算法和状态压缩技术解决经典的中国邮递员问题。在连通图中,寻找从任意点出发遍历所有边并返回起点的最短路径。当图不是欧拉图时,需要通过增加虚拟边形成欧拉回路,以确保每条边至少被访问一次。关键在于选择两个奇度节点之间最短距离的边作为虚拟边,以最小化总距离。采用动态规划方法,利用二进制表示奇度节点状态,并找出状态之间的最优转移,确保没有后效性且满足最优子结构。
最低0.47元/天 解锁文章
1247

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



