代码随想录训练营 Day59打卡 图论part09 Bellman_ford算法

news2024/9/20 5:40:45

代码随想录训练营 Day59打卡 图论part09

Bellman_ford 算法

例题:卡码94. 城市间货物运输 I

题目描述
某国为促进城市间经济交流,决定对货物运输提供补贴。共有 n 个编号为 1 到 n 的城市,通过道路网络连接,网络中的道路仅允许从某个城市单向通行到另一个城市,不能反向通行。
网络中的道路都有各自的运输成本和政府补贴,道路的权值计算方式为:运输成本 - 政府补贴。权值为正表示扣除了政府补贴后运输货物仍需支付的费用;权值为负则表示政府的补贴超过了支出的运输成本,实际表现为运输过程中还能赚取一定的收益。
请找出从城市 1 到城市 n 的所有可能路径中,综合政府补贴后的最低运输成本。如果最低运输成本是一个负数,它表示在遵循最优路径的情况下,运输过程中反而能够实现盈利。
城市 1 到城市 n 之间可能会出现没有路径的情况,同时保证道路网络中不存在任何负权回路。
输入描述
第一行包含两个正整数,第一个正整数 n 表示该国一共有 n 个城市,第二个整数 m 表示这些城市中共有 m 条道路。
接下来为 m 行,每行包括三个整数,s、t 和 v,表示 s 号城市运输货物到达 t 号城市,道路权值为 v (单向图)。
输出描述
如果能够从城市 1 到连通到城市 n, 请输出一个整数,表示运输成本。如果该整数是负数,则表示实现了盈利。如果从城市 1 没有路径可达城市 n,请输出 “unconnected”。
输入示例
6 7
5 6 -2
1 2 1
5 3 1
2 5 2
2 4 -3
4 6 4
1 3 5
输出示例
1
提示信息

示例中最佳路径是从 1 -> 2 -> 5 -> 6,路上的权值分别为 1 2 -2,最终的最低运输成本为 1 + 2 + (-2) = 1。
示例 2:
4 2
1 2 -1
3 4 -1
在此示例中,无法找到一条路径从 1 通往 4,所以此时应该输出 “unconnected”。

本题是求解带有负权边的单源最短路径问题,经典的 Dijkstra 算法要求边权为非负数,因此不能直接使用。为了解决含负权边的最短路径问题,Bellman-Ford 算法是一个很好的选择。

Bellman-Ford 算法简介:
Bellman-Ford 算法适用于求解包含负权边的单源最短路径问题。其主要特点是:

  1. 松弛操作:对每条边执行松弛操作,通过逐步更新节点的最短路径,找到最短路径。
  2. 松弛 n-1 次:在一个有 n 个节点的图中,最短路径最多经过 n-1 条边,因此我们需要对所有边进行 n-1 次松弛操作。
  3. 检测负权环:如果在 n-1 次松弛操作后仍然能继续松弛,说明图中存在负权环。

松弛操作的解释:
假设一条边从 from 节点指向 to 节点,边权为 price,当前 minDist[from] 表示从起点到 from 节点的最短距离。如果 minDist[from] + price < minDist[to],说明通过 from 到达 to 更短,因此更新 minDist[to]。

为何松弛 n-1 次:
在一个无环图中,最短路径最多经过 n-1 条边。每次松弛操作会传播最短路径的信息,因此在 n-1 次松弛后,所有节点的最短路径都会正确。如果还有负权环,第 n 次松弛会继续更新,说明存在负权环。

代码实现

import sys

def bellman_ford(n, m, edges, start, end):
    # 初始化最短距离数组,起点到其他节点的距离初始化为无穷大
    minDist = [float('inf')] * (n + 1)
    minDist[start] = 0  # 起点到自身的距离为 0

    # 对所有边进行 n-1 次松弛操作
    for _ in range(n - 1):
        for from_node, to_node, weight in edges:
            # 如果起点的距离不是无穷大,并且可以通过该边得到更短的距离,进行松弛
            if minDist[from_node] != float('inf') and minDist[to_node] > minDist[from_node] + weight:
                minDist[to_node] = minDist[from_node] + weight

    # 检查是否存在负权环:如果在 n-1 次松弛之后还能进行松弛,说明存在负权环
    for from_node, to_node, weight in edges:
        if minDist[from_node] != float('inf') and minDist[to_node] > minDist[from_node] + weight:
            print("Graph contains a negative weight cycle")
            return None  # 负权环的存在意味着无法找到最短路径

    # 返回从起点到终点的最短路径
    return -1 if minDist[end] == float('inf') else minDist[end]

# 读取输入并调用 Bellman-Ford 算法
if __name__ == "__main__":
    input = sys.stdin.read
    data = input().split()

    # 读取节点数 n 和边数 m
    n, m = int(data[0]), int(data[1])
    
    # 读取所有边,边的格式为 (起点, 终点, 权值)
    edges = []
    index = 2
    for _ in range(m):
        p1 = int(data[index])  # 起点
        p2 = int(data[index + 1])  # 终点
        val = int(data[index + 2])  # 权值
        edges.append((p1, p2, val))
        index += 3

    start = 1  # 起点
    end = n    # 终点

    # 调用 Bellman-Ford 算法计算从起点到终点的最短路径
    result = bellman_ford(n, m, edges, start, end)
    
    # 输出最短路径结果
    if result is not None:
        print(result)

时间复杂度分析:
时间复杂度:O(n * m),其中 n 是节点数,m 是边数。因为 Bellman-Ford 算法需要对所有边执行 n-1 次松弛操作。
空间复杂度:O(n),用于存储最短路径的数组 minDist。

Bellman-Ford 算法能够有效处理带有负权边的最短路径问题,并且可以检测负权环。它比 Dijkstra 算法更通用,但时间复杂度较高,适用于边权可能为负的情况。

卡码题目链接
题目文章讲解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2130942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FP7195:大功率钓鱼灯应用方案,覆盖低压大功率40W,60W,80W的应用市场

前言; 目前夜钓正在逐渐变得时尚起来&#xff0c;随着夜钓群体的年轻化&#xff0c;人们对于夜钓灯的审美要求也越来越高。夜钓灯作为夜间钓鱼的重点装备&#xff0c;不仅仅需要高质量的光源照亮水面浮漂&#xff0c;同时还需要融合一些其他功能&#xff0c;尽可能让夜钓者轻装…

深入理解CASAtomic原子操作类详解

1.CAS介绍 什么是 CAS CAS&#xff08;Compare And Swap&#xff0c;比较与交换&#xff09;&#xff0c;是非阻塞同步的实现原理&#xff0c;它是CPU硬件层面的一种指令&#xff0c;从CPU层面能保证"比较与交换"两个操作的原子性。CAS指令操作包括三个参数&#x…

【LLM text2sql】浅看大模型用于text2sql的综述

前言 之前笔者分享了text2sql & LLM & KG的有机结合实现KBQA的问答&#xff0c; 《【LLM & RAG & text2sql】大模型在知识图谱问答上的核心算法详细思路及实践》、 《【开源分享】KBQA核心技术及结合大模型SPARQL查询生成问答实践》。 我们再来看看大模型在te…

智慧农业——InsectMamba利用状态空间模型对害虫进行分类

介绍 论文地址&#xff1a;https://arxiv.org/abs/2404.03611 害虫分类是农业中的一个重要问题。准确识别有害害虫可减少对作物的损害&#xff0c;确保粮食安全和环境的可持续发展。然而&#xff0c;害虫及其自然环境的高度拟态性和物种多样性使得视觉特征的提取极具挑战性。…

桌面应用框架:tauri是后起之秀,赶上electron路还很长。

一、tauri介绍 Tauri 是一个开源的工具和框架&#xff0c;用于构建现代化的跨平台桌面应用程序。它允许开发者使用 Web 技术&#xff08;如 HTML、CSS 和 JavaScript&#xff09;来构建桌面应用&#xff0c;并将其打包为原生应用程序&#xff0c;以在不同的操作系统上运行。Ta…

深度剖析iOS渲染

iOS App 图形图像渲染的基本流程&#xff1a; 1.CPU&#xff1a;完成对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制。 2.GPU&#xff1a;GPU拿到CPU计算好的显示内容&#xff0c;完成纹理的渲染&#xff0c; 渲染完成后将渲…

安全政策与安全意识(下)

等保测评介绍及解决方案 目录 一, 等保介绍 1.1 分三个等级 1.2 等级保护发展历程 1.2.1 等保1.0 1.2.2 等保2.0 1.2.3 等保等级对比 1.3 等级保护依据的法律,法规 1.4 等级保护2.0的法规、标准体系 1.5 等级保护等级划分 1.6 等级保护政策内容 二, 等保必要性 三…

Zookeeper工作机制、特点、数据结构、应用场景、配置参数解读

ZK工作机制 从涉及模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff0c;负责存储和管理大家都关心的数据&#xff0c;然后接受观察者的注册&#xff0c;一旦这些数据的状态发生变化&#xff0c;zk就负责通知已在zk上注册的那些观察者做出相应…

基于PHP的丽江旅游管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的丽江旅游管理系统 一 介绍 此丽江旅游系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈&#xff1a;phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销…

Shopee哪些活动助力泰国卖家99大促销售额增长8倍?

9月11日&#xff0c;据外媒报道&#xff0c;Shopee 9.9大促已正式收官&#xff0c;活动上线仅18分钟泰国卖家就实现了10亿泰铢的销售额&#xff0c;创下新纪录。 Shopee泰国商业总监Karan Ambani表示&#xff0c;此次9.9大促成功彰显了平台通过超值优惠和便捷工具为用户提供优质…

什么麦克风最好,直播麦克风用哪种比较好,无线领夹麦克风推荐

无线领夹麦克风&#xff0c;作为现代演讲与录音领域的必备工具&#xff0c;但由于市场品牌繁多&#xff0c;很多消费者在选择时往往陷入困惑。根据市场反馈&#xff0c;大疆、西圣、罗德、猛犸等品牌在销量上均表现优异&#xff0c;其中西圣以其稳定传输与高保真音质&#xff0…

使用 SAX 在 TPU v5e 上部署和提供 Llama 2 模型

创建 TPU 以下步骤展示了如何创建用于您的模型的 TPU 虚拟机。 创建环境变量&#xff1a; export PROJECT_IDPROJECT_IDexport ACCELERATOR_TYPEACCELERATOR_TYPEexport ZONEZONEexport RUNTIME_VERSIONv2-alpha-tpuv5-liteexport SERVICE_ACCOUNTSERVICE_ACCOUNTexport TPU_…

总结中文纠错项目走过的那些坑(pycorrector)

一、项目地址及说明 pycorrector: 中文文本纠错工具。支持中文音似、形似、语法错误纠正&#xff0c;python3.8开发。 pycorrector实现了Kenlm、ConvSeq2Seq、BERT、MacBERT、ELECTRA、ERNIE、Transformer等多种模型的文本纠错&#xff0c;并在SigHAN数据集评估各模型的效果。…

【网络图】:附Origin详细画图教程

目录 No.1 理解网络图 No.2 画图流程 1 导入数据并绘图 2 设置绘图细节 3 效果图 No.1 理解网络图 网络图&#xff0c;是一种由节点&#xff08;或顶点&#xff09;和连接这些节点的边&#xff08;或链路&#xff09;组成的图形结构。在网络图中&#xff0c;节点通常代表…

OpenAI「草莓」两周内发布?网传不是多模态,反应慢了10多秒

就在刚刚&#xff0c;The Information曝出&#xff1a;OpenAI的草莓将于两周内上线&#xff01;收费疑似200刀一个月&#xff0c;最大的特色就是比其他模型多思考10到20秒。然而因为「狼来了」太多回&#xff0c;网友们忍不住吐槽&#xff1a;OpenAI现在就是个炒作公司。 来源…

十,Spring Boot 的内容协商的详细剖析(附+Debug调试说明)

十&#xff0c;Spring Boot 的内容协商的详细剖析(附Debug调试说明) 文章目录 十&#xff0c;Spring Boot 的内容协商的详细剖析(附Debug调试说明)1. 基本介绍2. 准备工作3. 内容协商的本质4. 内容协商&#xff1a;注意事项和使用细节5. 总结&#xff1a;6. 最后&#xff1a; 1…

k8s环境搭建(续)

查看节点信息并做快照 kubectl get nodes 将components.yml文件上传到master主机 创建nginx&#xff0c;会在添加一个新的pod kubectl run nginx --imagesnginx:latest 查看nginx的pod信息 [rootk8s-master ~]# kubectl get po -Aowide|grep nginx 出现错误&#xff0c;查…

Python | Leetcode Python题解之第399题除法求值

题目&#xff1a; 题解&#xff1a; class Solution:def calcEquation(self, equations: List[List[str]], values: List[float], queries: List[List[str]]) -> List[float]:# 构造图graph defaultdict(list)for (u, v), value in zip(equations, values):graph[u].appen…

Vite + Electron 时,Electron 渲染空白,静态资源加载错误等问题解决

问题 如果在 electron 里直接引入 vite 打包后的东西&#xff0c;那么有些资源是请求不到的 这是我的引入方式 根据报错&#xff0c;我们来到 vite 打包后的路径看一看 &#xff0c;修改一下 dist 里的文件路径试了一试 修改后的样子&#xff0c;发现是可以的了 原因分析 …

react 基础语法

前置知识 类的回顾 通过class关键字定义一个类 类名首字母大写 class类有constructor构造器 new 一个类得到一个实例 类还有方法&#xff0c;该方法也会在其原型上 static静态数据&#xff0c;访问静态属性通过 类名.id getter和setter getter&#xff1a;定义一个属性&…