ROADS
Time Limit: 1000MS |
|
Memory Limit: 65536K |
Total Submissions: 13840 |
|
Accepted: 5049 |
Description
N cities named with numbers 1 ... N are connected with one-way roads. Each road has two parameters associated with it : the road length and the toll that needs to be paid for the road (expressed in the number of coins).
Bob and Alice used to live in the city 1. After noticing that Alice was cheating in the card game they liked to play, Bob broke up with her and decided to move away - to the city N. He wants to get there as quickly as possible, but he is short on cash.
We want to help Bob to find
the shortest path from the city 1 to the city N
that he can afford with the amount of money he has.
Input
The first line of the input contains the integer K, 0 <= K <= 10000, maximum number of coins that Bob can spend on his way.
The second line contains the integer N, 2 <= N <= 100, the total number of cities.
The third line contains the integer R, 1 <= R <= 10000, the total number of roads.
Each of the following R lines describes one road by specifying integers S, D, L and T separated by single blank characters :
- S is the source city, 1 <= S <= N
- D is the destination city, 1 <= D <= N
- L is the road length, 1 <= L <= 100
- T is the toll (expressed in the number of coins), 0 <= T <=100
Notice that different roads may have the same source and destination cities.
Output
The first and the only line of the output should contain the total length of the shortest path from the city 1 to the city N whose total toll is less than or equal K coins.
If such path does not exist, only number -1 should be written to the output.
Sample Input
5
6
7
1 2 2 3
2 4 3 3
3 4 2 4
1 3 4 1
4 6 2 1
3 5 2 0
5 4 3 2
Sample Output
11
题目大意:有N个城市,编号从1到N,城市间有R条单向路,每个道路有两个属性,道路的长度和过路费。Bob有K块钱,他想从城市1走到城市N,问最短需要走多长的路,如果到不了N,输出-1.
解题思路:暑期课老师课件上的搜索题,这两天做比赛有一个题跟这个题目神似,就拿过来写写。
这个题必须要用到剪枝,用深搜搜索各个节点,记录下totaLen(走的过程中路径的长度),totalCost(走的过程中的花费)。用minLen记录最优路径。
剪枝一:一个最明显的剪枝就是如果在搜索的过程中,结果已经大于minLen,就不必往下继续搜索。
剪枝二:保存中间结果用于最优性剪枝。即在搜索的过程中,如果到达每个状态A时,发现前面也到达过A,且前边那次达到A所花的代价更少,则剪枝。具体做法就是保存到达状态A到目前为止的最优方案。具体此题来说,就是保存到达某个城市且过路费为某个值时,最优的路径,minL[N][Cost] 即到达某个城市N所花费价格为Cost的最优路径。如果在搜索过程中,到达城市N,且花费为Cost是路径大于原储存的路径长度,即剪枝。
运用上面两个剪枝之后,就可以过。时间大约150ms左右。
代码:
#include
#include
#include
#include
#include
#include