有意思的问题!
没想到我的一句评论,在榜首答案下被选上了热评:
一个人能在一个省份只经过一次的情况下把大陆31个省会城市自驾游一遍吗?
既然没看到其他人回答,那我就自己动手,丰衣足食吧。
<hr/>首先,可以看到这是一个典型的“图论”问题,经过 @金小乙 的分析和简化,我们得到了一个31个顶点的无向平面图(不考虑港澳台)。“无向图”而不是“有向图”是考虑到相邻省会互相往返的距离是一样的。
然后,我用高德地图得到了各个相邻省会之间的自驾行驶距离(和预计时长),起点终点都是输入城市名后地图上的默认点,好像大部分都是市政府所在地。
这里会有一些细节的处理。比如,第一步分析中已经知道不可能经过的路径,这里就偷懒不算了。
麻烦一点的是,有些特殊情况——相邻省会直接的行驶路线会经过第三省。例如,呼和浩特到哈尔滨,默认路线就经过了河北省和吉林省,需要设置一些中途点“绕过”第三省。有意思地,我还发现成都与昆明间的最短路线——银昆高速,竟然有一小段经过了贵州省,所以不得不绕路。
这样,把数据标记到高赞回答的图里,就得到了权重图:
剩下的问题,就是有没有算法来求解遍历所有顶点最短路径的算法了。
图论里经典的算法有很多,最基本的就是深度优先搜索(DFS)和广度优先搜索(BFS),可以通过其中一种方法把所有能够遍历顶点的路径找出来,然后在比较最短路径。但这个事情需要编程,工作量有点大,就偷懒不弄了。
然后有人提到了Dijkstra算法,但其实在这个问题上是用不了的。因为Dijkstra算法只是用来计算两个顶点之间的最短路径,并不会遍历所有顶点。
在图论里,遍历所有顶点(同时又不走重复的边)的问题,叫做哈密顿路径问题(Hamiltonian path problem)。这是图论中的一个非常经典的问题,并且也是计算机科学中著名的NPC问题——即确定在一个给定的图中是否存在哈密顿路径。所以,很显然地,我们不可能找到一个“简单”的确定性算法来解决这个问题。
不过好在,问题涉及到我国的省市也不多,只有31个(即问题规模不大),所以如果一定要用计算机精确求解,也是可以做到的。
<hr/>最后,我只能靠“肉眼”求解了。
首先,起点一定是海口,终点只能是北京或天津。从京津冀的“三角形”可以看到,最短路径应该是石家庄-北京-天津的路线,但是鉴于首都的特殊意义,我还是选择把北京设为终点,毕竟也不差那30公里。
然后,我用了两种“肉眼”算法来分析。
一是从海口出发,先尽量沿着较短的路径前进,再分析判断不可能路径或者必须要走的路径,得到下图:
结果为总路程22373公里,用时266.3小时:
二是先考虑对总路程影响比较大的西部地区,比如西藏相邻最短的两条路线分别是川藏和青藏,所以就一进一出。排除新藏线后,新疆相邻路线就只剩下了青海、甘肃两个选项,所以西部路线选择成都-拉萨-西宁-乌鲁木齐-兰州,然后把一些不能走的路线排除,比如甘肃到内蒙就不行了(否则绕了一圈去不了上面的东北三省了),然后在从中尽量选择较短的路径,得到下图:
结果为总路程22019公里,用时263.4小时:
考虑到导航地图测量误差,两个结果可以说非常接近了。可能也是我“肉眼”看多了,形成了路径依赖,其实最后这两条路线非常接近,差别只在南宁到拉萨的路线选择不同(一个从滇藏线入藏,一个从川藏线入藏)。
如果再算上自驾游途中经停、住宿的额外路程,应该大致在25000公里的样子,同时导航时间不考虑吃饭睡觉,实际用时40天到60天(大概2个月)应该可以走完。
<hr/>今天就终结本回答吧,我写了个程序,遍历了从广州到呼和浩特的全部哈密顿路径,一共得到1873条路径,其中最短路径正是我“肉眼”发现的这一条:
即最短总路程22019公里,用时263.4小时。
既然都已经程序遍历,我还找了一下全部路径里的“最长路径”,如下:
即最长总路程26761公里,用时321.3小时。
可以看到,因为每个省(市)只能路经一次,在这个严格的条件限制下,实际上最长路线和最短路线上有很多重复的经由,所以实际上路程差距并不大(最长与最短只相差4700多公里)。
所以选一条喜欢的路线,走起,自驾游的驴友们! |