最短路算法—Bellman-Ford算法

上一篇笔记介绍了Dijkstra算法的两种实现方式,其中朴素版本的Dijkstra算法的时间复杂度为\(O(N^2+M)\),而堆优化版本的时间复杂度为:\(O(M∗log(N))\)
对于稀疏图,我们一般采用Dijkstra算法,对于稠密图我们一般采用堆优化版本的Dijkstra算法。
而Dijkstra算法求最短路存在一个缺点:边权不能为负,而对于求存在负边权的最短路,我们一般采用的最短路算法有:Bellman-Ford算法、SPFA算法、以及Floyd算法。
下面本文将会减少Bellman-Ford算法。
Bellman-Ford算法的应用场景为:
对于选择的边数存在限制。
时间复杂度为:\(O(M*N)\)

#include <bits/stdc++.h>
using namespace std;
const int N = 510; //点数
const int M = 10010; //边数;
const int INF = 0x3f3f3f3f; // 定义为无穷大。
struct Edge{
int a,b,w;
} e[M];
int dist[N]; // 跟Dijkstra算法中的dist数组作用一样,是为了存在所求点到其他点的最短路。
int back[N]; //备份数组,防止更新迭代的时候产生二次迭代。
int n,m,k; // 最多选择K条边。

int bellman-ford(){
  memset(dist , INF ,sizeof(dist));
  dist[1] = 0;
  for(int i = 0;i < k;i++){
  memcpy(back , dist , sizeof(dist));
  for(int j = 0;j < m;j++){ //遍历所有的边
    int a = e[j].a , b = e[j].b , w = e[j].w;
    back[b] = fmin(back[b] , dist[a] + w); //更新最小边; 使用back更新是为了避免更新完一个点之后立刻拿这个点更新之后的点。
  }
  if(dist[n] > INF / 2) return -1;
  return dist[n];
}
posted @ 2022-10-12 21:05  Appreciate_小白  阅读(37)  评论(0)    收藏  举报