LeetCode //C - 787. Cheapest Flights Within K Stops

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;
}
### Dijkstra算法相关的LeetCode题目 Dijkstra算法主要用于解决单源最短路径问题,适用于加权图中的路径计算。以下是与Dijkstra算法密切相关的LeetCode题目: #### 题目一:网络延迟时间 (Network Delay Time) 这是一道经典的Dijkstra算法应用题,目标是找到信号从起点传播到所有节点所需的最长时间。如果无法到达某些节点,则返回 `-1`[^1]。 ```python import heapq from collections import defaultdict def networkDelayTime(times, n, k): graph = defaultdict(list) for u, v, w in times: graph[u].append((v, w)) dist = {node: float('inf') for node in range(1, n + 1)} dist[k] = 0 heap = [(0, k)] while heap: current_dist, u = heapq.heappop(heap) if current_dist > dist[u]: continue for v, weight in graph[u]: distance = current_dist + weight if distance < dist[v]: dist[v] = distance heapq.heappush(heap, (distance, v)) max_time = max(dist.values()) return max_time if max_time != float('inf') else -1 ``` 此代码实现了基于优先队列优化的Dijkstra算法来解决问题。 --- #### 题目二:最低成本连接所有城市 (Min Cost to Connect All Points) 虽然该题主要涉及Kruskal或Prim算法,但在特定情况下也可以通过构建完全图并使用Dijkstra算法求解[^2]。不过需要注意的是,这种方法效率较低,通常不推荐作为首选方案。 --- #### 题目三:最便宜航班 (Cheapest Flights Within K Stops) 尽管本题可以通过Bellman-Ford或者BFS方法解答,但采用修改版的Dijkstra同样可行。区别在于需要增加状态维度以记录剩余跳跃次数[^5]。 ```python def findCheapestPrice(n, flights, src, dst, k): graph = defaultdict(list) for u, v, p in flights: graph[u].append((v, p)) pq = [(0, src, k + 1)] # price, vertex, stops remaining while pq: cost, city, steps_left = heapq.heappop(pq) if city == dst: return cost if steps_left > 0: for neighbor, price in graph[city]: new_cost = cost + price heapq.heappush(pq, (new_cost, neighbor, steps_left - 1)) return -1 ``` 上述实现展示了如何扩展传统Dijkstra逻辑适应更多约束条件下的场景需求[^5]。 --- ### 总结 以上列举了几类适合练习Dijkstra算法的经典LeetCode题目及其对应解决方案概览。每种变体都体现了不同实际应用场景下对该基础理论框架的具体调整运用方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Navigator_Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值