Ballman_ford 的应用(有限边的最短路问题)LeetCode787.K站中转内最便宜航班

Ballman-ford模板

cpp 复制代码
int n, m;       // n表示点数,m表示边数
int dist[N];        // dist[x]存储1到x的最短路距离

struct Edge     // 边,a表示出点,b表示入点,w表示边的权重
{
    int a, b, w;
}edges[M];

// 求1到n的最短路距离,如果无法从1走到n,则返回-1。
int bellman_ford()
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;

    // 如果第n次迭代仍然会松弛三角不等式,就说明存在一条长度是n+1的最短路径,由抽屉原理,路径中至少存在两个相同的点,说明图中存在负权回路。
    for (int i = 0; i < n; i ++ )
    {
        for (int j = 0; j < m; j ++ )
        {
            int a = edges[j].a, b = edges[j].b, w = edges[j].w;
            if (dist[b] > dist[a] + w)
                dist[b] = dist[a] + w;
        }
    }

    if (dist[n] > 0x3f3f3f3f / 2) return -1;
    return dist[n];
}

一般来说图论有关Ballman-ford算法都能用spfa替代,时间复杂度要优秀很多,但朴素版的Ballman-ford在解决这么一类问题有着很大优势。
题目描述:

有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。

现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。

示例 1:

复制代码
输入: 
n = 4, flights = [[0,1,100],[1,2,100],[2,0,100],[1,3,600],[2,3,200]], src = 0, dst = 3, k = 1
输出: 700 
解释: 城市航班图如上
从城市 0 到城市 3 经过最多 1 站的最佳路径用红色标记,费用为 100 + 600 = 700。
请注意,通过城市 [0, 1, 2, 3] 的路径更便宜,但无效,因为它经过了 2 站。

示例 2:

复制代码
输入: 
n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]], src = 0, dst = 2, k = 1
输出: 200
解释: 
城市航班图如上
从城市 0 到城市 2 经过最多 1 站的最佳路径标记为红色,费用为 100 + 100 = 200。

示例 3:

复制代码
输入:n = 3, flights = [[0,1,100],[1,2,100],[0,2,500]], src = 0, dst = 2, k = 0
输出:500
解释:
城市航班图如上
从城市 0 到城市 2 不经过站点的最佳路径标记为红色,费用为 500。
cpp 复制代码
class Solution {
public:
    int dis[110];
    int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int k) {
        int m=flights.size();
        memset(dis,0x3f,sizeof(dis));
        dis[src]=0;
        for(int i=0;i<=k;i++){
            int diss[110];
            for(int k=0;k<n;k++){
                diss[k]=dis[k];
            }
            for(int j=0;j<m;j++){
                int a=flights[j][0];
                int b=flights[j][1];
                int c=flights[j][2];
                if(diss[b]>diss[a]+c){
                    dis[b]=min(dis[b],diss[a]+c);
                }
            }
        }
        
        if(dis[dst]==0x3f3f3f3f){
            return -1;
        }else{
            return dis[dst];
        }
    }
};
相关推荐
daidaidaiyu7 小时前
ThingsBoard 集群的核心逻辑源码分析
java
2601_962885728 小时前
如何用 Python 自动识别股票的支撑位与压力位?
开发语言·python
爱吃奥利奥_wen8 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
我可能是个假开发8 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
caoerzhong8 小时前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·python·开源
WL学习笔记9 小时前
日期类(C++)
开发语言·c++·日期类实现
【JAVA】玩家9 小时前
Spring核心原理全解析:从零到生产实战
java·后端·spring
Wang's Blog10 小时前
Java框架 SpringCloud 快速入门: 实现 Feign 最佳实践(抽取方式)
java·spring cloud
谢亮_vipxieliang10 小时前
Go map与结构体的正确使用
开发语言·golang·哈希算法
H.莓飛10 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio