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 站中转的路线,使得从 srcdst价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -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];
        }
    }
};
相关推荐
Python测试之道3 分钟前
Deepseek API+Python 测试用例一键生成与导出 V1.0.6(加入分块策略,返回更完整可靠)
开发语言·python·测试用例
SRC_BLUE_177 分钟前
Python GUI 编程 | QObject 控件基类详解 — 定时器
开发语言·数据库·python
啊阿狸不会拉杆14 分钟前
第二十一章:Python-Plotly库实现数据动态可视化
开发语言·python·plotly
okok__TXF20 分钟前
Mybatis源码分析
java·后端·mybatis
滴答滴答嗒嗒滴25 分钟前
Python小练习系列 Vol.12:学生信息排序(sorted + key函数)
开发语言·python
白云如幻38 分钟前
【Java】Hibernate的一级缓存
java·hibernate
eternal__day1 小时前
Spring Boot 快速入手
java·spring boot·后端·spring·java-ee·maven
愚润求学1 小时前
【C++】vector常用方法总结
开发语言·c++·vector
天天进步20151 小时前
Python项目-基于Flask的个人博客系统设计与实现(1)
开发语言·python·flask
爱的叹息1 小时前
Spring Boot中事务状态(TransactionStatus)的核心信息及常见应用场景
java·spring boot·后端