787. Cheapest Flights Within K Stops
There are n cities connected by some number of flights. You are given an array flights where f l i g h t s [ i ] = [ f r o m i , t o i , p r i c e i ] flights[i] = [from_i, to_i, price_i] flights[i]=[fromi,toi,pricei] indicates that there is a flight from city f r o m i from_i fromi to city t o i to_i toi with cost p r i c e i price_i pricei.
You are also given three integers src, dst, and k, return the cheapest price from src to dst with at most k stops. If there is no such route, return -1.
Example 1:
Input: n = 4, flights = [[0,1,100],[1,2,100],[2,0,100],[1,3,600],[2,3,200]], src = 0, dst = 3, k = 1
Output: 700
Explanation:
The graph is shown above.
The optimal path with at most 1 stop from city 0 to 3 is marked in red and has cost 100 + 600 = 700.
Note that the path through cities [0,1,2,3] is cheaper but is invalid because it uses 2 stops.
Example 2:
Input: n = 3, flights = [[0,1,100],[1,2,100],[0,2,500]], src = 0, dst = 2, k = 1
Output: 200
Explanation:
The graph is shown above.
The optimal path with at most 1 stop from city 0 to 2 is marked in red and has cost 100 + 100 = 200.
Example 3:
Input: n = 3, flights = [[0,1,100],[1,2,100],[0,2,500]], src = 0, dst = 2, k = 0
Output: 500
Explanation:
The graph is shown above.
The optimal path with no stops from city 0 to 2 is marked in red and has cost 500.
Constraints:
- 1 <= n <= 100
- 0 <= flights.length <= (n * (n - 1) / 2)
- flights[i].length == 3
- 0 < = f r o m i , t o i < n 0 <= from_i, to_i < n 0<=fromi,toi<n
- f r o m i ! = t o i from_i != to_i fromi!=toi
- 1 < = p r i c e i < = 1 0 4 1 <= price_i <= 10^4 1<=pricei<=104
- There will not be any multiple flights between two cities.
- 0 <= src, dst, k < n
- src != dst
From: LeetCode
Link: 787. Cheapest Flights Within K Stops
Solution:
Ideas:
-
dist[i] keeps the minimum cost to reach city i from the source.
-
For up to k stops (thus k+1 flights), the algorithm iteratively relaxes all flights.
-
temp[i] prevents using updated values in the same iteration.
Code:
int findCheapestPrice(int n, int** flights, int flightsSize, int* flightsColSize, int src, int dst, int k) {
int* dist = (int*)malloc(sizeof(int) * n);
int* temp = (int*)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++)
dist[i] = (i == src) ? 0 : INT_MAX;
for (int t = 0; t <= k; t++) {
// Copy current distances to temp
for (int i = 0; i < n; i++)
temp[i] = dist[i];
// Relax all edges
for (int i = 0; i < flightsSize; i++) {
int u = flights[i][0];
int v = flights[i][1];
int w = flights[i][2];
if (dist[u] != INT_MAX && dist[u] + w < temp[v])
temp[v] = dist[u] + w;
}
// Update distances
for (int i = 0; i < n; i++)
dist[i] = temp[i];
}
int result = dist[dst];
free(dist);
free(temp);
return result == INT_MAX ? -1 : result;
}