LeetCode #787. Cheapest Flights Within K Stops

题目描述:

There are n cities connected by m flights. Each fight starts from city 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 from 0 to n - 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:
    int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int K) {
        vector<vector<pair<int,int>>> graph(n);
        for(auto flight:flights)
            graph[flight[0]].push_back({flight[1],flight[2]});
        int result=INT_MAX;
        queue<pair<int,int>> q;
        // 记录节点到起点的距离不能用哈希表dist,距离更新可能会影响到之后的同层节点,即某一层中存在i,j两个点
        // 而且存在一条边i->j,那么遍历i的邻接点,就会更新dist[j],从而影响之后遍历j的邻接点
        q.push({src,0});
        int count=1;
        while(!q.empty())
        {
            int n=q.size();
            for(int i=0;i<n;i++)
            {
                int u=q.front().first, dist=q.front().second;
                q.pop();
                for(auto p:graph[u])
                { // u为中间点,v可能为终点,所以访问u的时候已经更新了v的距离
                    int v=p.first, cost=p.second;
                    if(dist+cost>result) continue; //到达任意一点的距离已经超过到终点的距离
                    if(v==dst) result=min(result,dist+cost);
                    q.push({v,dist+cost});
                }
            }
            // 在当前层访问结束后count加一,因为后面一层的距离已经更新了
            count++;
            // 注意K为起点和终点的中间点个数,count为路径节点总数
            if(K==count-2) break;
        }
        if(result==INT_MAX) return -1;
        else return result;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值