Bellman-Ford(最短路)
bellmen-ford算法,与dijkstra不同,bellman-ford可以运用于有负权值的图,不过复杂度很高,O(N*M )… 慎用~(可以用SPFA,它bwllman-ford的扩展)
Bellman-ford算法同样是对每条边进行N-1次松弛,当有权值为负时,对所有边进行N-1次松弛,如果dis还能更新,说明有负环。
ps:名词解释【负环】 在一个图里每条边都有一个权值(有正有负)
如果存在一个环(从某个点出发又回到自己的路径),而且这个环上所有权值之和是负数,那这就是一个负权环,也叫负权回路
存在负权回路的图是不能求两点间最短路的,因为只要在负权回路上不断兜圈子,所得的最短路长度可以任意小。
Bellman-ford原理:
1.如果最短路存在,则每个顶点最多经过一次,因此不超过n-1条边;
2.长度为k的路由长度为k-1的路加一条边得到;
3.由最优性原理,只需依次考虑长度为1,2,…,k-1的最短路。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int inf=0x3f3f3f3f;
int main()
{int i,k,n,m;int u[10],v[10],w[10],dis[10];scanf("%d%d",&n,&m);for(i=1; i<=n; i++)scanf("%d%d%d",&u[i],&v[i],&w[i]); for(i=0; i<=n; i++)dis[i]=inf;dis[1]=0;int flag;for(k=1; k<n; k++){flag=0; //标记dis数组会不会变化//进行一轮松弛for(i=1; i<=m; i++){if(dis[v[i]]>dis[u[i]]+w[i]) //表示u[i]->v[i]这条边的值+1号顶点到u[i]点的值是否小于原来1号顶点到u[i]点的值{dis[v[i]]=dis[u[i]]+w[i];flag=1;//dis数组更新}}if(flag==0) break; //表示数组松弛完毕}flag=0; //检验是否会出现负环for(i=1; i<=m; i++)if(dis[v[i]]>dis[u[i]]+w[i]) flag=1; //若还能松弛则存在负环if(flag==0){for(i=1; i<=n; i++)printf("%d ",dis[i]);printf("\n");}elseprintf("此图存在负环回路\n");return 0;
}
Bellman-Ford 算法往往不到n-1轮就已经松弛完毕,用标记变量可以减少循环次数。
在这个算法中加入队列进行优化就是SPFA算法,等看懂了在写一下。
Bellman-Ford(最短路)相关推荐
- SPFA or bellman ford松弛法--单源最短路
问题概述:有编号1-n的n个站点,有m条公交车路线,公交车只从一个起点站直接到达终点站,是单向的且每条路线有它自己的车费,有P个人早上从1出发,他们要到达每一个公交站点,然后到了晚上再返回点1,求所有 ...
- bellman ford 算法 判断是否存在负环
Flyer 目录视图 摘要视图 订阅 微信小程序实战项目--点餐系统 程序员11月书讯,评论得书啦 Get IT技能知识库,50个领域一键直达 关闭 bellman for ...
- bellman - ford算法c++
(最短路III)bellman - ford算法(适用于含负权边的图) 注意:用该算法求最短路,在有边数限制的情况下可以存在负权回路!且对所走的边的数量有要求时只能用该算法实现! 解析:因为如果没有边 ...
- Bellman Ford算法详解
一.用途 1. Bellman Ford算法是解决拥有负权边最短路问题的方法之一.还有一种方法是SPFA算法. 2. 二者相比,SPFA算法在效率方面是优于Bellman Ford算法的.但在某些情况 ...
- 图解Bellman Ford算法
Bellman Ford 单源最短路径算法[中字] Bellman Ford 单源最短路径算法[中字]_哔哩哔哩_bilibili 贝尔曼-福特算法(Bellman–Ford algorithm )油 ...
- LeetCode 787. K 站中转内最便宜的航班(图/Bellman Ford算法)
文章目录 贝尔曼-福特算法(Bellman-Ford) 简介 算法思想 算法执行过程 应用 题目描述 分析 代码 LeetCode 787. K 站中转内最便宜的航班 题目描述 Bellman For ...
- Bellman ford算法(贝尔曼·福特算法)
Bellman - ford算法是求含负权图的单源最短路径的一种算法,效率较低,代码难度较小.其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在n-1次松弛后还能更新,则说明图中有负环,因此无 ...
- C++实现bellman ford贝尔曼-福特算法(最短路径)(附完整源码)
C++实现bellman ford贝尔曼-福特算法 实现bellman ford贝尔曼-福特算法的完整源码(定义,实现,main函数测试) 实现bellman ford贝尔曼-福特算法的完整源码(定义 ...
- Bellman——Ford算法
Bellman--Ford 算法介绍 思路讲解 案例分析与代码实现 案例分析 代码实现 优先队列优化(SPFA) 优化原理 代码实现 算法介绍 我们知道Dijkstra算法只能用来解决正权图的单源最短 ...
- bellman ford 算法
Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的.这时候,就需要使用其他的算法来求解最短 ...
最新文章
- 设置VSCode运行任务命令快捷键Alt+R,通常用于npm start(对频繁使用该命令可节省50%的输入命令行打字时间)
- 联手小米,雀巢中国推出健康管家Nesfinity,满足个性化生活需求管理
- 优先级调度和运行前调度的比较
- 无源定位之时差估计的精确时差估计算法(ETDE)及MATLAB实现程序
- BZOJ3091: 城市旅行
- php curl 批量,PHP实现的curl批量请求操作
- 技术回归本位:海尔引领空调产业重构格局
- vm 虚拟机 删除 权限_虚拟机win7一键傻瓜式安装
- 有关Data Input类组件的研究——Silverlight学习笔记[26]
- error: exception handling disabled, use -fexceptions to enable
- angularJs模版注入的两种方式
- unity商店创建开发者账户
- 华为云人脸识别服务 FRS 之初体验
- 【最新最详细】SQL Server 2019 安装教程{超详细 附网盘下载链接}
- HTML期末作业-我的大学生活
- 视频号如何做出美食爆款视频,美食类爆款技巧
- 零基础C语言入门001——编译器下载
- RANSAC和SAC-IA
- 中国博客网告别免费午餐 用户数据清除延至7月1日
- 面试积累(java配置环境变量)
热门文章
- 计算机sql查询同行并集,SQL查询交集、并集、差集
- 四巫日来临本周硅铁、铁矿石领跌,铁矿石认沽最高31倍,钢厂利润回升2022.6.17
- 垃圾小白羊leetcode刷题记录3
- C# 利用AEC算法加密解密实现前台后台安全校验,附前端后台代码示例
- SecureCRT注册机使用方法
- 如何安装iOS 13 、 macOS Catalina 、watchOS 6 、 tvOS 13 或 iPadOS Beta
- springboot+mybatis打包时,单元测试类报错
- 通知与服务——服务Service——服务的绑定与解绑延迟绑定服务与解绑服务
- Linux怎么同步另一台设备的时间
- java8判断当前时间是否大于某个时间