There are n
cities connected by m
flights. Each flight 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 city0
to city2
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 city0
to city2
with at most 0 stop costs 500, as marked blue in the picture.
Constraints:
- 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.
class solution{
public:
struct entry{
int loc, cost, k;
bool operator<(const entry& item) const{
return item.cost<cost;
}
};
int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int K) {
vector<vector<pair<int, int>>> adj(n);
for(vector<int> f:flights) adj[f[0]].push_back({f[1], f[2]});
priority_queue<entry, vector<entry>> q;
q.push({src, 0, 0});
while(!q.empty()){
entry e = q.top();
q.pop();
if(e.k-1>K) continue;
if(e.loc == dst) {
if(e.k-1<=K) return e.cost;
else continue;
}
if(adj[e.loc].empty()) continue;
for(pair<int, int> p:adj[e.loc])
q.push({p.first, p.second+e.cost, e.k + 1});
}
return -1;
}
};