BF求图的最短路径的时间复杂度是O(MN),这样的时间复杂度并不比迪杰斯特拉算法好,但是BF算法支持图中存在负权的情况,但图中不能存在负圈,因为如果存在负圈,最短路是不存在的,因此BF算法的另一个重要应用是判负圈(如果松弛了N-1次后,还能松弛,就说明存在负圈)

简单写法(没有判断是否存在负圈。判断负圈只要在最后判断能否继续进行松弛即可)

 #include<iostream>
 using namespace std;
 ;
 <<;
 int d[maxn],w[maxn],f[maxn],t[maxn];
 int main()
 {
     int N,M;
     cin>>N>>M;
     ;i<M;i++){
         cin>>f[i]>>t[i]>>w[i];
     }
     ;i<=N;i++) d[i]=inf;
     d[]=;
     ;i<=N-;i++){//最短路径最多经过N-1个节点 需要N-1轮松弛
         ;j<M;j++){//枚举所有的边
             int x=f[j],y=t[j];
             if(d[x]<inf) d[y]=min(d[y],d[x]+w[j]);
         }
     }
     cout<<d[N];
     ;
 }

可以用队列进行优化,代替上面的循环检查(代码来自 刘汝佳《算法竞赛入门经典》)

 #include<iostream>
 #include<vector>
 #include<cstring>
 #include<queue>
 using namespace std;
 <<;
 ;
 struct Edge{
     int from,to,dist;
 };
 vector<Edge> edges;
 vector<int> G[maxn];
 int N,M;
 int inq[maxn]/*在队列里的标记*/,cnt[maxn]/*某个节点进入队列的次数,也就是松弛的次数*/;
 int d[maxn];
 bool bellman_ford(int s){
     queue<int> Q;
     memset(inq,,sizeof(inq));
     memset(cnt,,sizeof(cnt));
     ;i<=N;i++) d[i]=inf;
     d[s]=;inq[s]=;Q.push(s);

     while(!Q.empty()){
         int u=Q.front();Q.pop();
         inq[u]=;//出队
         ;i<G[u].size();i++){
             Edge& e=edges[G[u][i]];
             if(d[u]<inf&&d[e.to]>d[u]+e.dist){
                 d[e.to]=d[u]+e.dist;
                 if(!inq[e.to]){
                     Q.push(e.to);inq[e.to]=;//入队
                     if(++cnt[e.to]>N) return false;
                 }
             }
         }
     }
   return true;
 }
 int main()
 {
     int f,t,dd;
     cin>>N>>M;
     ;i<M;i++){
         cin>>f>>t>>dd;
         edges.push_back((Edge){f,t,dd});
         int m=edges.size();
         G[f].push_back(m-);
     }
     ))//起点是1
         cout<<d[N];//终点是N
     else cout<<"Impossible!";//存在负圈
     ;
 }

图的最短路算法 Bellman-Ford的更多相关文章

  1. 图的最短路算法 Dijkstra及其优化

    单源最短路径算法 时间复杂度O(N2) 优化后时间复杂度为O(MlogN)(M为图中的边数 所以对于稀疏图来说优化后更快) 不支持有负权的图 #include<iostream> usin ...

  2. 图的最短路算法 Floyd

    多源最短路径算法 时间复杂度O(N3) 简单修改可求有向图的传递闭包 #include<iostream> using namespace std; const int maxn=1024 ...

  3. Bellman - Ford 算法解决最短路径问题

    Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...

  4. poj1860 bellman—ford队列优化 Currency Exchange

    Currency Exchange Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 22123   Accepted: 799 ...

  5. Bellman—Ford算法思想

    ---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...

  6. 算法专题 | 10行代码实现的最短路算法——Bellman-ford与SPFA

    今天是算法数据结构专题的第33篇文章,我们一起来聊聊最短路问题. 最短路问题也属于图论算法之一,解决的是在一张有向图当中点与点之间的最短距离问题.最短路算法有很多,比较常用的有bellman-ford ...

  7. Til the Cows Come Home 最短路Dijkstra+bellman(普通+优化)

    Til the Cows Come Home 最短路Dijkstra+bellman(普通+优化) 贝西在田里,想在农夫约翰叫醒她早上挤奶之前回到谷仓尽可能多地睡一觉.贝西需要她的美梦,所以她想尽快回 ...

  8. ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)

    两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可 ...

  9. Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)

    上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做&q ...

随机推荐

  1. makefile详解 嵌套执行make,定义命令包

    嵌套执行make 在一些大的工程中,我们会把我们不同模块或是不同功能的源文件放在不同的目录中,我们可以在每个目录中都书写一个该目录的Makefile,这有利于让我们的Makefile变得更加地简洁,而 ...

  2. ASP.NET的POST和GET提交并接收处理返回值

    POST方法: 数据提交 /// <summary> /// POST提交数据接收字符json /// </summary> /// <param name=" ...

  3. PHP中的中文截取乱码问题_gb2312_utf-8

    一.字符串编码为gb2312,一个中文占俩字节 public static function chinesesubstr($str, $start, $len) { // $str指字符串,$star ...

  4. 玩转sublime(一)——玩转全局文件搜索/替换

    这个快捷键好记,一般的搜索是Ctrl+f,多了一个Shift就是全局搜索

  5. 停止某个机房所有机器上包的脚本 pack_idc_stop.py

    一.初衷: 鉴于公司的进程包package都是冗余多点部署的,一般一个idc机房有多台机器部署同一个package.当机房网络出问题的时候,我们不得不查到本机房部署了哪些package,并在包发布系统 ...

  6. c++学习-数组

    int a[10]; //是个元素,在windows下回报错,linux会输出一个随机数 int a[10]={1,2}; //初始化,其他的为0 数组越界: 为了调高效率, 编译器不会对数组越界做检 ...

  7. 内网Linux对公网开启SSH

    1.首先你得装个Linux,过程就不说了.Linux可以装在Vmware上,但是网络适配器选项选的是桥接模式 2.在linux上安装SSH服务,如果有就自动忽略 3.在路由器上开启端口映射. 这里我用 ...

  8. 内联函数inline

    1:使用inline函数的时候,必须使函数体和inline说明结合一起,否则编译器将视他为普通函数处理: false: inline void Coord::setcoord(int a,int b) ...

  9. NSMutableAttributedString 设置不同颜色,不同字体的String

    UILabel *infoLabel = [[UILabel alloc]initWithFrame:CGRectMake(95, 20, 190, 70)]; infoLabel.backgroun ...

  10. Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面 z

    http://www.cnblogs.com/zuowj/p/4504130.html 不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景 也最为 ...