关于最短路径问题,最近学了四种方法——bellman算法、邻接表法、dijkstra算法和floyd-warshall算法。

这当中最简单的为bellman算法,通过定义一个边的结构体,存储边的起点、终点和路径长度,然后通过一个while(1)死循环不断地访问每一条边,更新源点到各点的最短距离,直到没有更新时结束。这时便得到了从源点到其他点的最短距离。附上代码一段:

#include<iostream>
#define INF 100000000
using namespace std;

struct eg
  {
    int s,t;
    int c;
  };//边的结构体,存储元素为起点s,终点t,路径s到t之间的长度
eg Eg[100];
int dis[100];

void bellman(int s,int E)
  {
    fill(dis,dis+100,INF);//初始化所有最短距离为INF;
    dis[s]=0;//但源点的最短距离为0,自己到自己
    while(1)
      {
        bool update= false;
        for(int i=0;i<E;i++)
          {
            eg e=Eg[i];
            if(dis[e.s]!=INF && dis[e.t]>dis[e.s]+e.c)//更新
              {
                dis[e.t]=dis[e.s]+e.c;
                update = true;
              }
          }
        if(!update)//如果遍历所有的边均不再有更新,则跳出循环
        break;
    }
  }

int main()
  {
    int E;//定义边的变量
    cin >> E;
    for(int i=0;i<E;i++)//直接存储边
      {
        cin >> Eg[i].s >> Eg[i].t >> Eg[i].c;
      }

    int s1;

    cin >> s1;//定义一个源点

    bellman(s1,E);
    int t;
    cin >> t;
    cout << dis[t] << endl;
    return 0;
  }

综上代码我们可以分析,bellman算法的时间复杂度为o(v*e),while循环最多执行v-1次;bellman算法还存在一个问题在于负圈,如果图中存在源点s可达的负圈(图中存在的环并且这个环里面有负边(边的值为负值)),当while循环更新时,走到这个负圈,dis【e.t】>dis[e.s]+e.c则是恒成立,每次的while循环中都会有更新,这样再用刚刚的那个方法的话就会形成死循环,所以,用bellman算法得保证图中不存在源点s可达的负圈。附上查找负圈的代码:

bool find_negative_loop()

{

  memset(dis,0,sizeof(dis));//注意和fill的写法不同(fill(dis,dis+e,INF))

  for(int i=1;i<=v;i++)

    for(int j=0;j<e;j++)

      {

        eg e=Eg[j];

        if(dis[e.t]>dis[e.s]+e.c)

          {

           dis[e.t]=dis[e.s]+e.c;

           if(i==v) return true;

         }

      }

}

最短路径问题——bellman算法的更多相关文章

  1. 数据结构与算法--最短路径之Bellman算法、SPFA算法

    数据结构与算法--最短路径之Bellman算法.SPFA算法 除了Floyd算法,另外一个使用广泛且可以处理负权边的是Bellman-Ford算法. Bellman-Ford算法 假设某个图有V个顶点 ...

  2. 最短路径问题——floyd算法

    floyd算法和之前讲的bellman算法.dijkstra算法最大的不同在于它所处理的终于不再是单源问题了,floyd可以解决任何点到点之间的最短路径问题,个人觉得floyd是最简单最好用的一种算法 ...

  3. 最短路径问题——dijkstra算法

    仅谈谈个人对dijkstra的理解,dijkstra算法是基于邻接表实现的,用于处理单源最短路径问题(顺便再提一下,处理单源最短路径问题的还有bellman算法).开辟一个结构体,其变量为边的终点和边 ...

  4. Bellman算法

    Bellman算法 当图有负圈的时候可以用这个判断最短路! [时间复杂度]O(\(nm\)) &代码: #include <bits/stdc++.h> using namespa ...

  5. 单源最短路径(dijkstra算法)php实现

    做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...

  6. 最大流算法之EK(最短路径增广算法)

    这是网络流最基础的部分--求出源点到汇点的最大流(Max-Flow). 最大流的算法有比较多,本次介绍的是其中复杂度较高,但是比较好写的EK算法.(不涉及分层,纯粹靠BFS找汇点及回溯找最小流量得到最 ...

  7. 【算法设计与分析基础】25、单起点最短路径的dijkstra算法

    首先看看这换个数据图 邻接矩阵 dijkstra算法的寻找最短路径的核心就是对于这个节点的数据结构的设计 1.节点中保存有已经加入最短路径的集合中到当前节点的最短路径的节点 2.从起点经过或者不经过 ...

  8. 最短路径问题---Dijkstra算法详解

    侵删https://blog.csdn.net/qq_35644234/article/details/60870719 前言 Nobody can go back and start a new b ...

  9. 数据结构与算法--最短路径之Floyd算法

    数据结构与算法--最短路径之Floyd算法 我们知道Dijkstra算法只能解决单源最短路径问题,且要求边上的权重都是非负的.有没有办法解决任意起点到任意顶点的最短路径问题呢?如果用Dijkstra算 ...

随机推荐

  1. 解决服务器时间Local time和RTC time不一致的问题

    今天遇到了一个问题,发现程序读取的时间比实际的时间快了几分钟. 执行 timedatectl status 发现 Local time比实际的快,但是RTC time是准确的. 各种google也没搞 ...

  2. android 待机流程

    以下分析基于android2.2的google源码.  开机启动时,首先执行PhoneWindowManager.systemReady()(这之前的流程不分析).调用KeyguardViewMed ...

  3. [Oracle] SQL*Loader 详细使用教程(1)- 总览

    SQL*Loader原理   SQL*Loader是Oracle提供的用于数据加载的一种工具,它比较适合业务分析类型数据库(数据仓库),能处理多种格式的平面文件,批量数据装载比传统的数据插入效率更高. ...

  4. python的ujson与simplejson

    一.使用了simplejson import simplejson as json 二.使用ujson import ujson as json 参考链接:下载win下的:ujson

  5. windows+linux开发环境 解决laravel blade模板缓存问题

    编码环境windows10 编码IDE:phpstorm 2016.2 PHP框架:laravel5.3 + 代码运行环境:centos7 + nginx 在开发过程中,上传blade模板文件到lin ...

  6. javascript事件之:谈谈自定义事件

    对于JavaScript自定义事件,印象最深刻的是用jQuery在做图片懒加载的时候.给需要懒加载的图片定义一个appear事件.当页面图片开始出现时候,触发这个自定义的appear事件(注意,这里只 ...

  7. 【ros】.bag文件

    Bags are typically created by a tool like rosbag They store the serialized message data in a file as ...

  8. 在与SQL Server建立连接时出现于网络相关的或特定于实例的错误

    客户遇到一个问题,用“服务器名\实例名”远程连接另外一台命名实例的时候连接失败,报“在与SQL Server建立连接时出现于网络相关的或特定于实例的错误,未找到或无法访问服务器.请验证实例名称是否正确 ...

  9. 支持向量机(SVM)算法

  10. python编程技巧2

    模块化 ---- 这是我们程序员梦寐以求的,通过模块化可以避免重复的制造轮子. 同时 模块让你能够有逻辑地组织你的Python代码段. 把相关的代码分配到一个 模块里能让你的代码更好用,更易懂. 模块 ...