[经典] 深搜寻路问题
2016-03-29 19:21
155 查看
除了各种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个城市都走到的最短路径的长度。
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个城市都走到的最短路径的长度。
相关文章推荐
- 二分查找(折半查找)
- POJ 1039 Pipe (直线与线段间的关系)
- 结队项目阶段报告
- 第五周作业 长方形
- [HNOI2016]树
- bzoj 3050: [Usaco2013 Jan]Seating
- edge.js
- ViewPager禁止滑动的问题
- 61D的代码如何利用Catcher抓取log
- 第五周上机实践项目 项目1--三角形类雏形(1)
- C++文件读写 实现文件每行数据齐长输出
- 在Ubuntu 10.04中文版下Qt编程,使用unixODBC和FreeTDS连接MS SQL Server 2005,并且中文不出现乱码的方法
- 第五周 时钟1
- 第五周 游戏角色类
- 高度和宽度不固定元素水平和垂直居中的实现(父元素高度和宽度固定)(完美解决兼容问题)
- Java 实现工厂设计模式的三种方式
- 第五周上机实践项目1(3):三角形类雏形
- POJ 1845 Sumdiv 简单数论问题
- C++拷贝构造函数详解
- ubuntu下执行.py文件