首页 > 其他分享 >Bellman-Ford

Bellman-Ford

时间:2024-08-03 21:38:38浏览次数:10  
标签:dist int Bellman edge edges Ford

Bellman-Ford

Bellman-Ford 算法通过使用松弛操作来逐步更新节点的最短路径距离,并在第 V 次松弛操作后检测负权重环路。这使得它能够处理带有负权重边的图,并检测到负权重环路的存在。
时间复杂度为 O(V * E)。

伪代码:

for n-1 次:
  for 所有边(a,b,w)进行松弛操作:
   dist[b] = min(dist[b], dist[a] + w);

java 模板

class BellmanFord {
    
    public static void bellmanFord(int[][] edges, int n, int source) {
        // 初始化距离数组
        int[] dist = new int[n];
        Arrays.fill(dist, Integer.MAX_VALUE);
        dist[source] = 0;

        // 迭代松弛操作(n-1)次
        for (int i = 0; i < n - 1; i++) {
            for (int[] edge : edges) {
                int u = edge[0];
                int v = edge[1];
                int w = edge[2];

                if (dist[u] != Integer.MAX_VALUE && dist[u] + w< dist[v]) {
                    dist[v] = dist[u] + w;
                }
            }
        }

        // 检测负权重环(第n次松弛操作还能更新)
        for (int[] edge : edges) {
            int u = edge[0];
            int v = edge[1];
            int w = edge[2];

            if (dist[u] != Integer.MAX_VALUE && dist[u] + w< dist[v]) {
                System.out.println("存在负权环");
                return;
            }
        }

        System.out.println("起点到各个点的最短距离:");
        for (int i = 0; i < n; i++) {
            System.out.println("从" + source + "到" + i + "的最短距离为:" + dist[i]);
        }
    }

    public static void main(String[] args) {
        int V = 5; // 节点数量
        int[][] edges = {
            {0, 1, 4},
            {0, 2, 1},
            {1, 3, 1},
            {2, 1, 2},
            {2, 3, 5},
            {3, 4, 3},
            {4, 3, -2},
            {4, 0, 2}
        };
        BellmanFord1.bellmanFord(edges, V, 0);
    }
}

标签:dist,int,Bellman,edge,edges,Ford
From: https://www.cnblogs.com/licwuu/p/18341149

相关文章

  • 图的最短路径算法(SPFA,Dijkstra,Bellman_Ford)(迪杰斯特拉算法,Spfa算法,贝尔曼-福特算
    目录Dijkstra迪杰斯特拉算法写法时间复杂度例题描述输入描述输出描述样例输入用例输出用例写法Spfa算法例题描述输入描述输出描述样例输入用例输出用例写法Bellman_Ford算法(贝尔曼-福特算法)写法例题描述输入描述输出描述样例输入样例输出样例......
  • 代码随想录算法训练营第六十六天 | Bellman_ford 队列优化算法(SPFA)、Bellman_ford之
    Bellman_ford队列优化算法(SPFA)题目链接:https://kamacoder.com/problempage.php?pid=1152文档讲解:https://programmercarl.com/kamacoder/0094.%E5%9F%8E%E5%B8%82%E9%97%B4%E8%B4%A7%E7%89%A9%E8%BF%90%E8%BE%93I-SPFA.html思路Bellman_ford算法每次松弛都是对所......
  • 代码随想录算法训练营第六十五天 | dijkstra(堆优化版)精讲、Bellman_ford 算法精讲、复
    dijkstra(堆优化版)精讲—卡码网:47.参加科学大会题目链接:https://kamacoder.com/problempage.php?pid=1047文档讲解:https://programmercarl.com/kamacoder/0047.%E5%8F%82%E4%BC%9Adijkstra%E5%A0%86.html思路当节点数多,边数少(稀疏图)时,可以考虑从边的角度出发,用堆来......
  • 城市间货物运输Ⅰ-卡玛(Bellman_ford)
    题目链接:城市间货物运输Ⅰ本篇学习了代码随想录Bellman_ford算法精讲,本题是经典的带负权值的单源最短路问题,Dijkstra求单源最短路问题的前提是图中的边无负权重。当图中的边存在负权重时,就需要使用Bellman_ford算法来进行求解了。Bellman_ford算法的核心思想是对......
  • 将stanfordcorenlp的tokenizer换成自定义的(或用stanfordcorenlp对自定义tokenizer分词
    本文是基于中文语料做的,对于英文语料应该也是同理,即同样适用的。分析stanfordcorenlp的分词结果,可以发现,它好像是对最小的中文词进行分词,即其对中文的分词粒度很小,这对于某些nlp场景可能就不太合适了,自然的就想到能不能将stanfordcorenlp中用于分词的tokenizer替换掉,替换成自......
  • Keras深度学习框架实战(3):EfficientNet实现stanford dog分类
    1、通过EfficientNet进行微调以实现图像分类概述通过EfficientNet进行微调以实现图像分类,是一个使用EfficientNet作为预训练模型,并通过微调(fine-tuning)来适应特定图像分类任务的过程。一下是对相关重要术语的解释。EfficientNet:这是一个高效的卷积神经网络(CNN)架构,旨在通过......
  • Stanford斯坦福 CS 224R: 深度强化学习 (7)
    多任务和目标条件强化学习第一章引言1.1多任务学习的动机在之前的课程中,我们学习了强化学习的基本概念和算法,如模仿学习、策略梯度、Q学习等。然而,这些方法在实际应用中往往面临着样本效率低下的挑战。收集大量高质量的互动数据是昂贵且耗时的,特别是对于复杂的决策......
  • Stanford斯坦福 CS 224R: 深度强化学习 (6)
    CS224R离线强化学习:第二部分课程介绍请看第一节内容课程回顾离线强化学习、数据约束和保守性离线强化学习旨在利用离线数据,重复使用离线数据是有益的。其关键挑战是由于πβ......
  • bellmax-ford算的证明
    设\(dist[x]\)表示源点到\(x\)的最短路的距离(图中无负环),若对图中任意一条边\((x,y,z)\)满足\(dist[y]≤dist[x]+z\),那么\(dist\)就是最短路数组证:考虑任意一个点\(a\),假设找出了一条源点到\(a\)的最短路径{\(x_0,x_1,...,x_n,a\)},那么显然这条路径上\(x_0\)到任意一个点一定是最......
  • Bellman_Ford
    基本上用不到的算法,和高精度一样,不常用,用到了又无可代替常用于限制边数的最短路算法。使用范围可以处理任意边权的图,可以处理负环,可以判断负环。时间复杂度\(O(nm)\)。因为太慢了,在求最短路的时候基本用不到,但是它的优化版SPFA则大大优化了时间复杂度,算是最短路里最好用的算......