关于最短路径问题,最近学了四种方法——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. 教你解决Sublime Text中文乱码问题

    教你解决Sublime Text中文乱码问题[转载自成长的企鹅]       Sublime Text 2是一个非常不错的源代码及文本编辑器,但是不支持GB2312和GBK编码在很多情况下会非常麻烦. ...

  2. Hosts文件的使用

    hosts文件是什么?在哪里?hosts文件:系统文件,可以记事本打开并编辑.一般用于域名到ip地址的解析.当用户在浏览器中输入网络的域名时,系统首先会自动从hosts文件中找到对应的ip地址,一旦找 ...

  3. Openstack+Kubernetes+Docker微服务实践之路--选型

    上一篇博文中我们选定Openstack做为我们的基础设施IAAS平台,本文将明确我们用什么技术做为微服务平台的技术选型. 经过对微服务的特性总结和添加一些个性需求后对微服务平台的基本要求 PRC远程调 ...

  4. const char* && string && String^ 类型转换

    const char* && string && String^ 类型转换 const char* ---> string const char * cw= &q ...

  5. MFC编程入门之八(对话框:创建对话框类和添加控件变量)

    创建好对话框资源后要做的就是生成对话框类了.生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数. 例程Addition是基于对话框的程序,所以程序自动创建了对话框模板IDD_ADDIT ...

  6. Django1.9开发博客(9)- 用户认证

    你应该注意到了一点,当你去新建.修改和删除文章的时候并不需要登录,这样的话任何浏览网站的用户都能随时修改和删除我的文章.这个可不是我想要的! 编辑和删除的认证 我们需要保护post_new, post ...

  7. table表格中实现tbody部分可滚动,且thead部分固定

    1.想要实现表格的thead部分固定切tbody部分可滚动,就需要将thead与tbody进行分离,具体做法是 1.设置thead,tbody都为display:block: 2.设置th与td的宽度 ...

  8. uva 1660 & poj 1966(点连通度)

    Cable TV Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4267   Accepted: 2003 ...

  9. C#获取参数getParameter

    昨天遇到了这样一个问题,getParameter时,首次进入页面读取默认值时,本应该读取到“全部”这个字符. 然后在实际读取过程当中却不是这样,实际读取到的是  类的对象值 重新运行时能够读取到 “全 ...

  10. HBase Cassandra Riak HyperTable

    Cassandra                                                              HBase 一致性 Quorum NRW策略 通过Goss ...