图论详解——Bellman-Ford(清晰易懂)

这篇具有很好参考价值的文章主要介绍了图论详解——Bellman-Ford(清晰易懂)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开学第一周,晚上属实作业有点乱

于是就拖更了一周

图论详解——Bellman-Ford(清晰易懂)

今天我们来讲解一下图论最短路径算法中

最简单

最清晰易懂

同时时间复杂度最高的算法

它的时间复杂度能达到O(VE)(点的数量*边的数量)

在学习Bellman-Ford之前,你需要先学会链式前向星

大家可以上网或者其他途径自行查阅一下

  1. 原理

这个算法是对图进行v-1次松弛操作(v为点的数量)

完了?

啊 完了

图论详解——Bellman-Ford(清晰易懂)

松弛看不懂没事

继续往下看

正式开始讲原理:

图论详解——Bellman-Ford(清晰易懂)

日常建个小图

有没有权值无所谓,没有权值就当作1

假设我们要求1点到5点的最短路径

第一步:把1连接的所有边的目标点更新最短路径路径

图论详解——Bellman-Ford(清晰易懂)

最短路径更新成现在这样

现在更新2的

这是可以发现,1到5的路程可以更新了

2+7<10

所以更新

然后剩下的就没什么可更新的了

这样算出来,1到5的最短路程就是9


上面一套流程,就是我们用贝尔曼福特算法的过程

而2+7<10这步,就叫做松弛操作

松弛N-1次,每次都遍历每个点的每条边,能松则松,不能松就不松


没错 贝尔曼福特还是这么简单

但这也造成了他时间复杂度贼高

就比如上图

3的松弛根本没用,也造成了时间上的问题

如果n<=10^6

那浪费的时间不可设想

另外 它还有一个优点

就是能处理负权环

怎么处理呢?

先来看下普通代码

# include <iostream>
# include <cstdio>
# include <cmath>
# include <cstring>
using namespace std;
# define int long long
# define N 10005
# define M 10005
int s,t,n,m,m2;
double f[N];
struct node{
    int x,y;
}a[N];
struct node2{
    int to,next;
    double w;
}e[M];
int adj[N];
void add(int u,int v,double w2){
    m2++;
    e[m2].to=v;
    e[m2].w=w2;
    e[m2].next=adj[u];
    adj[u]=m2;
    return ;
}
void relax(int u,int v,double w2){
    if (f[v]>f[u]+w2){
        f[v]=f[u]+w2;
    }
    return ;
}
void ford(){
    memset(f,0x7f7f,sizeof(f));
    f[s]=0;
    for (int i=1;i<=n-1;i++){
        for (int j=1;j<=n;j++){
            for (int k=adj[j];k;k=e[k].next){
                int l=e[k].to;
                relax(j,l,e[k].w);
            }
        }
    }
    return ;
}
signed main(){
    ford();
    printf("%.2lf",f[t]);
    return 0;
}

本代码编写的是从s到t的最短路径,所以f[i]表示s到i的最短路径


解决下刚才的问题:负权环怎么解决

因为我们是n-1次松弛操作

在这种情况下,保证能把这个图的最短路径求出来

而负权环什么意思?他不可能有最短路径

图论详解——Bellman-Ford(清晰易懂)

就是这个样子了

他每绕一圈,路径都-14

所以无限循环求不出

要想检测这种情况

就要松弛n次,如果第n次还有可以能松弛的

那说明就是负权环


有些同学就要问了

f数组不是动态规划里的吗?而且这个松弛操作为什么看上去这么像动态规划的状态转移方程啊?

没错你的直觉是正确的

图论详解——Bellman-Ford(清晰易懂)
图论详解——Bellman-Ford(清晰易懂)

自己的算法用自己的成就 天经地义()

今天的Bellman-Ford算法的讲解就到这里

如果还有哪些问题或不懂的地方 随时可以评论文章来源地址https://www.toymoban.com/news/detail-458706.html

图论详解——Bellman-Ford(清晰易懂)

到了这里,关于图论详解——Bellman-Ford(清晰易懂)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法基础:搜索与图论】3.4 求最短路算法(Dijkstra&bellman-ford&spfa&Floyd)

    关于最短路可见:https://oi-wiki.org/graph/shortest-path/ 无向图 是一种 特殊的 有向图。(所以上面的知识地图上没有区分边有向还是无向) 关于存储:稠密图用邻接矩阵,稀疏图用邻接表。 朴素Dijkstra 和 堆优化Dijkstra算法的 选择就在于图 是 稠密的还是稀疏的。 算法步骤: 有一

    2024年02月16日
    浏览(42)
  • 图搜索算法详解 - DFS、BFS、Bellman-Ford、Dijkstra

    图搜索算法是许多应用程序的基础,例如社交网络分析、路径规划、数据挖掘和推荐系统。在本文中,我们将深入探讨图搜索算法的世界,探索它们的定义、重要性和实际应用。 图搜索算法是一种用于遍历图的技术,图是由 关系 连接的 节点集合 。在社交网络、网页或生物

    2024年02月16日
    浏览(41)
  • 最短路之 Bellman-ford 算法

    若有向图有n个点,m条边 。 扫描所有边,对每条边进行一次松弛(即对a,b为端点 , 权重为w的边,dist[b] = min(dist[a] , dist[a] + w )) 重复此流程(最多重复n次)直到没有更新操作发生 给你一张 n 个顶点 m 条边的有向简单图,顶点编号从 1 到 n,每条边都有一个边权,边权为非

    2024年02月17日
    浏览(40)
  • Bellman-ford 贝尔曼-福特算法

    Bellman-ford算法可以解决负权图的单源最短路径问题 --- 它的优点是可以解决有负权边的单源最短路径问题, 而且可以判断是否负权回路 它也有明显的缺点,它的时间复杂度O(N*E)(N是点数 , E是边数)普遍是要高于Dijkstra算法O(N^2)的,像这里,我们使用邻接矩阵实现,那

    2024年02月06日
    浏览(43)
  • 最短路径算法 | Bellman-Ford Algorithm

    我们在之前的文章中已经讨论了最短路径算法中最经典的Dijkstra‘s Algorithm。然而,Dijkstra\\\'s Algorithm虽然好用,却仍然存在一些缺点即无法解决带有负权重路线的问题,改进后的Dijkstra算法尽管可以解决一些简单的负权重问题,但仍然无法解决带有负循环的图的最短路径问题。

    2024年02月08日
    浏览(51)
  • 单源最短路径(spfa,Dijkstra, bellman-ford)

    目录  Dijkstra 原理:基于贪心。 为什么 Dijkstra 不能处理有负边的情况 Bellman-ford 原理:动态规划, 实质见floyd的另一篇博客 1,能找负环, 2,有变数限制的最短路径 spfa 原理 spfa怎么求负环, 原理:基于贪心。 第一步 初始化距离,dist[1] = 0, 一号点到起点的距离为0, 其他点

    2024年02月04日
    浏览(48)
  • 最短路问题 Bellman-Ford(单源最短路径)(图解)

    对于边(u,v),用dist(u)和(u,v)的和尝试更新dist(v):                          dist(v) = min(dist(v) , dist(u)+l(u,v) 注:dist(i)为源点(起点)到i点的距离,l(u,v)为u-v的边权。 Bellman-Ford的基本操作是进行多次迭代,每一轮迭代对图上所有边进行松弛操作,直到

    2024年02月09日
    浏览(38)
  • Bellman-Ford-贝尔曼-福特-算法求最短路-负环

    Bellman-Ford(贝尔曼-福特)算法基于松弛操作的单源最短路算法。 e[u]存u点的出边的邻点和边权,d[u]存u点到源点的距离。 初始化,ds]=0,d[其它点]=+o; 执行多轮循环。每轮循环,对所有边都尝试进行一次松弛操作; 当一轮循环中没有成功的松弛操作时,算法停止 为什么最坏需要

    2024年02月13日
    浏览(37)
  • 最短路径算法( Dijkstra + Bellman-Ford + SPFA + Floyd)

       文章目录 一、Dijkstra 算法 1、1 朴素版Dijkstra算法 1、1、1 Dijkstra求最短路 I 1、1、2 题解关键思路与与解答 1、2 堆优化版Dijkstra算法 1、2、1 Dijkstra求最短路 II 1、2、2 题解关键思路与答案 二、Bellman-Ford 算法 2、1 Bellman-Ford算法求有边数限制的最短路 2、1、1 题目描述 2、

    2023年04月08日
    浏览(33)
  • bellman_ford算法判负环-洛谷P3371

    总结:这题改了很久,一直wa 问题一:多测要清空数组 问题二:本题其实有点特殊,它要求的是,从1开始出发能到达的负环,也就是这个1实际上必须能到这个负环,如果图不连通,就会出现有负环但1去不了,等于没有负环的情况,这种特殊情况bellman_ford算法是压根没法解决的 一个玄学方法

    2024年02月06日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包