787. Cheapest Flights Within K Stops
There are n
cities connected by m
flights. Each fight starts from city u
and arrives at v
with a price w
.
Now given all the cities and flights, together with starting city src
and the destination dst
, your task is to find the cheapest price from src
to dst
with up to k
stops. If there is no such route, output -1
.
Example 1: Input: n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]] src = 0, dst = 2, k = 1 Output: 200 Explanation: The graph looks like this:
The cheapest price from city 0 to city 2 with at most 1 stop costs 200, as marked red in the picture.
Example 2: Input: n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]] src = 0, dst = 2, k = 0 Output: 500 Explanation: The graph looks like this:
The cheapest price from city 0 to city 2 with at most 0 stop costs 500, as marked blue in the picture.
Note:
- The number of nodes
n
will be in range[1, 100]
, with nodes labeled from0
ton
- 1
. - The size of
flights
will be in range[0, n * (n - 1) / 2]
. - The format of each flight will be
(src,
dst
, price)
. - The price of each flight will be in the range
[1, 10000]
. k
is in the range of[0, n - 1]
.- There will not be any duplicated flights or self cycles.
Approach #1: C++. []DFS
class Solution { public: int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int K) { unordered_map<int, vector<pair<int, int>>> graph; for (auto flight : flights) { int s = flight[0], e = flight[1], p = flight[2]; graph[s].push_back(make_pair(e, p)); } unordered_set<int> seen; dfs(graph, seen, src, dst, K, 0, 0); return ans == INT_MAX ? -1 : ans; } void dfs(unordered_map<int, vector<pair<int, int>>>& graph, unordered_set<int> seen, int src, int dst, int K, int t, int p) { if (t > K+1) return ; if (src == dst) { ans = p; return ; } seen.insert(src); for (auto v : graph[src]) if (!seen.count(v.first) && p + v.second < ans) dfs(graph, seen, v.first, dst, K, t+1, p+v.second); } private: int ans = INT_MAX; };
Analysis:
In this solution, The important point is p + v.second < ans.
永远渴望,大智若愚(stay hungry, stay foolish)