当前位置:   article > 正文

图论详解——Bellman-Ford(清晰易懂)_bellman-ford流程图

bellman-ford流程图

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

于是就拖更了一周


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

最简单

最清晰易懂

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

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

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

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

  1. 原理

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

完了?

啊 完了


松弛看不懂没事

继续往下看

正式开始讲原理:

日常建个小图

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

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

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

最短路径更新成现在这样

现在更新2的

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

2+7<10

所以更新

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

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


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

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

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


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

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

就比如上图

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

如果n<=10^6

那浪费的时间不可设想

另外 它还有一个优点

就是能处理负权环

怎么处理呢?

先来看下普通代码

  1. # include <iostream>
  2. # include <cstdio>
  3. # include <cmath>
  4. # include <cstring>
  5. using namespace std;
  6. # define int long long
  7. # define N 10005
  8. # define M 10005
  9. int s,t,n,m,m2;
  10. double f[N];
  11. struct node{
  12. int x,y;
  13. }a[N];
  14. struct node2{
  15. int to,next;
  16. double w;
  17. }e[M];
  18. int adj[N];
  19. void add(int u,int v,double w2){
  20. m2++;
  21. e[m2].to=v;
  22. e[m2].w=w2;
  23. e[m2].next=adj[u];
  24. adj[u]=m2;
  25. return ;
  26. }
  27. void relax(int u,int v,double w2){
  28. if (f[v]>f[u]+w2){
  29. f[v]=f[u]+w2;
  30. }
  31. return ;
  32. }
  33. void ford(){
  34. memset(f,0x7f7f,sizeof(f));
  35. f[s]=0;
  36. for (int i=1;i<=n-1;i++){
  37. for (int j=1;j<=n;j++){
  38. for (int k=adj[j];k;k=e[k].next){
  39. int l=e[k].to;
  40. relax(j,l,e[k].w);
  41. }
  42. }
  43. }
  44. return ;
  45. }
  46. signed main(){
  47. ford();
  48. printf("%.2lf",f[t]);
  49. return 0;
  50. }

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


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

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

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

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

就是这个样子了

他每绕一圈,路径都-14

所以无限循环求不出

要想检测这种情况

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

那说明就是负权环


有些同学就要问了

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

没错你的直觉是正确的

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

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

如果还有哪些问题或不懂的地方 随时可以评论

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/222364
推荐阅读
相关标签
  

闽ICP备14008679号