[经典] 深搜寻路问题

除了各种Dijkstra,Floyd算法,很多寻路问题都是带有条件,很难应用类似方法,这时的通用做法是深搜剪枝

1. 如POJ1724, N个城市, 编号1到N。城市间有R条单向道路。 每条道路连接两个城市,有长度和过路费两个属性。 Bob只有K块钱,他想从城市1走到城市N。问最短共需要走多长的路。如果到不了N,输出-1

2<=N<=100
0<=K<=10000
1<=R<=10000
每条路的长度 L, 1 <= L <= 100 每条路的过路费T , 0 <= T <= 100

解题思路:

【初始想法】从城市1开始DFS遍历整个图,找到所有能到达N的解法,选一个最优的。

【最优性剪枝】从城市1开始DFS遍历整个图,如果当前找到的最优解肯定没有上一个好了,则直接放弃。

【具体做法】保存中间计算结果,用于最优性剪枝。用midL[k][m] 表示:走到城市k时总过路费为m的条件下,最优路径的长度。若在 后续的搜索中,再次走到k时,如果总路费恰好为m,且此时的路径长度已经超过 midL[k][m],则不必再走下去了。 

【另外】还可以运用A*算法,预测一下从当前状态到解的状态至少要花的代价W(可以很粗略很乐观, 小于真实的最小代价),如果W加上到达当前状态时已经花费的代价,必 然不小于目前找到的最优解,则剪枝 

2. 限制更强的有指定途经点问题。N个城市,编号1到N。起点是1,终点是N(N<=16)。任意两个城市间都有路,A->B和B->A的路可能不一样长。 已知所有路的长度,问从1出发到达N且经每个城市恰好一次的最短路径的长度。

【最优性剪枝】的保存中间计算结果的做法,但如何存储到某个状态的“目前最小代价” 呢?状态由两部分构成: 1)已经走过的城市(除最后一个城市外,其他城市顺序不重要) 2) 走过的最后一个城市,除解状态以外的状态总数上限:14*2^14,可以用一个的14*2^14二维数组存放到达某个状态的“目前为止最小代价” 

【另外】运用A*算法,可是怎么预测从当前状态到解状态的至少代价? 假设还有 c1,c2....N 这k个城市还没有走到,则接下来一定要走k段两个城市间的道路,且这k段路终点分别是c1,c2 ... N,取终点为c1的路中最短的那条,再取终点为c2的路中最短的那条 .... 取终点为N的路中最短的那条。它们的长度之和,一定不大于把这k个城市都走到的最短路径的长度。 

posted @ 2016-03-29 19:21  CarlGoodman  阅读(545)  评论(0编辑  收藏  举报