这个算法也是紧承我们之前讲过的关于图论的内容,我们在前面分析图的时候说过了对于不同的图论问题,我们会有不同的求解方法,那么这里我们讲到Bellman-Ford算法是用于解决有边数限制的求解最短路问题。

我们先介绍一下我们之前讲过的Dijkstra算法为什么在这里失灵了,因为我们之前讲的Dijkstra算法是不适合求解含有负权边的最短路问题,原因如下图:

换言之,Dijkstra算法是找距离源点最近的点取更新别的点,这是一种贪心的思想,但是在具有负权边的问题时,局部最优解不一定是全局最优解,因为存在负权边,导致一开始大的边也有可能小下去。

Bellman—Ford算法的核心:对每一条边都进行松弛操作

每次松弛操作实际上是对相邻节点的访问(相当于广度优先搜索),第n次松弛操作保证了所有深度为n的路径最短。由于图的最短路径最长不会经过超过|m| - 1条边,所以可知Bellman—Ford算法所得为最短路径,也可知时间复杂度为O(mn)。

代码:

#include<bits/stdc++.h>
#define maxn 510
#define maxm 10010

using namespace std;
int dist[maxn],backup[maxn],n,m,k;

struct EDGE{
int x,y,z;
}edge[maxm];

void bellman_ford(){
memset(dist , 0x3f , sizeof(dist));
dist[1] = 0;
for(int i = 1; i<=k; i++){
memcpy(backup,dist,sizeof(dist));
for(int j = 1; j<=m; j++){
int a = edge[j].x , b = edge[j].y , w = edge[j].z ;
dist[b] = min(dist[b],backup[a] + w);
}
}
}

int main()
{
cin >> n >> m >> k;
for(int i = 1;i<=m;i++){
int a,b,c;
cin >> a >> b >> c;
edge[i].x = a; edge[i].y = b; edge[i].z = c;
}

bellman_ford();
if(dist[n] > 0x3f3f3f3f/2) cout << "impossible" << '\n';
else cout << dist[n] << '\n';
return 0;
}

分析:

·我们对dist数组还是初始化为0x3f3f3f3f,但是最后在判断的时候去要求  >=0x3f3f3f3f/2:

这是因为我们在进行松弛操作的时候是对每一条边都进行的, 所以本来时0x3f3f3f3f的地方可能被有负权边的路径给更新,所以我们只要保证他在一个量级就行了!

· 我们在每一次更新数值的时候,我们发现用到了一个backup数组,这个是用来干什么的呢:

我们在按顺序更新数值的时候,我们如果直接用dist数组直接更新,有可能会导致前一个刚被更新的紧接着去更新下一个,这样就不能保证边数的限制了!

所以我们就要把上一次的值copy到backup数组中!

Bellman-Ford算法 求有边数限制的最短路的更多相关文章

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

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

  2. Bellman—Ford算法思想

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

  3. Dijkstra算法与Bellman - Ford算法示例(源自网上大牛的博客)【图论】

    题意:题目大意:有N个点,给出从a点到b点的距离,当然a和b是互相可以抵达的,问从1到n的最短距离 poj2387 Description Bessie is out in the field and ...

  4. 853. 有边数限制的最短路(Bellman-ford算法模板)

    给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出从1号点到n号点的最多经过k条边的最短距离,如果无法从1号点走到n号点,输出impossible. 注意:图中可能 存 ...

  5. Prim算法求权数和,POJ(1258)

    题目链接:http://poj.org/problem?id=1258 解题报告: #include <iostream> #include <stdio.h> #includ ...

  6. acwing 853. 有边数限制的最短路 模板

    地址 https://www.acwing.com/problem/content/description/855/ 给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出 ...

  7. AcWing 853. 有边数限制的最短路 bellman-ford 结构体

    //存在负权值 处理负环 //如果能求出来 一般是不存在负权回路 //如果有负回路 那最小距离可能是负无穷 #include <cstring> #include <iostream ...

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

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

  9. uva 558 - Wormholes(Bellman Ford判断负环)

    题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...

随机推荐

  1. AttributeText创建多彩文字Label --- hl

    一般用富文本实现多种花样的Label文字,下图是利用UILabel分类快速创建的多彩多样lable文字,快速简单,自定义性强,更重要的是无代码污染,特别适合轻量级使用 https://github.c ...

  2. Elasticsearch使用系列-基本查询和聚合查询+sql插件

    Elasticsearch使用系列-ES简介和环境搭建 Elasticsearch使用系列-ES增删查改基本操作+ik分词 Elasticsearch使用系列-基本查询和聚合查询+sql插件 Elas ...

  3. spring boot 配置静态路径

    一  前言 最近有个项目,需要上传一个zip文件(zip文件就是一堆的html压缩组成)的压缩文件,然后后端解压出来,用户可以预览上传好的文件. 查看资料,spring boot对静态文件,可以通过配 ...

  4. make小tip

    总所周知make一般需要Makefile才能编译相关源码,但也可以无需Makefile就能编译一些简单的源代码. 在算法竞赛里,一道题的源程序一般只有一个文件,此时用Makefile显得十分累赘,但如 ...

  5. mysql查询的时候没有加order by时的默认排序问题

    有时候我们执行MySQL查询的时候,查询语句没有加order by,但是发现结果总是已经按照id排序好了的,难道MySQL就是为了好看给我们排序 如上图数据,是我查询了语句 SELECT * from ...

  6. shell脚本批量配置多台主机静态ip

    关于脚本 服务器使用之前,都需要先配置静态IP,那就将这种简单重复的工作,交给脚本来处理吧,让我们运维有更多的时间喝茶看报刷微博 脚本使用 sh ssh.sh ip.txt ssh.sh 为脚本的名称 ...

  7. php使用CURL进行模拟登录采集数据

    <?php $cookie_path = './'; //设置cookie保存路径 //-----登录要提交的表单数据--------------- $vars['username'] = '张 ...

  8. 数据缓存Cache

    在MyBatis - 随笔分类 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中有关于Mybatis中Cache技术实现及应用介绍.Cache技术实现都是implements Cache ...

  9. 解决POI多线程导出时数据错乱问题

    项目里有一个导出功能,但随着数据量大量上涨,导出时间长到不可忍受,遂重写此接口,多线程导出的代码并不复杂,每页有一条线程负责写入,利用线程池去调度,用countdownLatch保证在所有数据写完后再 ...

  10. Spring cloud是什么? 核心总结

    Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来,从而简化了开发者的代码量. S ...