Bellman-Ford算法 求有边数限制的最短路
这个算法也是紧承我们之前讲过的关于图论的内容,我们在前面分析图的时候说过了对于不同的图论问题,我们会有不同的求解方法,那么这里我们讲到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算法 求有边数限制的最短路的更多相关文章
- Bellman - Ford 算法解决最短路径问题
Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...
- Bellman—Ford算法思想
---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...
- Dijkstra算法与Bellman - Ford算法示例(源自网上大牛的博客)【图论】
题意:题目大意:有N个点,给出从a点到b点的距离,当然a和b是互相可以抵达的,问从1到n的最短距离 poj2387 Description Bessie is out in the field and ...
- 853. 有边数限制的最短路(Bellman-ford算法模板)
给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出从1号点到n号点的最多经过k条边的最短距离,如果无法从1号点走到n号点,输出impossible. 注意:图中可能 存 ...
- Prim算法求权数和,POJ(1258)
题目链接:http://poj.org/problem?id=1258 解题报告: #include <iostream> #include <stdio.h> #includ ...
- acwing 853. 有边数限制的最短路 模板
地址 https://www.acwing.com/problem/content/description/855/ 给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出 ...
- AcWing 853. 有边数限制的最短路 bellman-ford 结构体
//存在负权值 处理负环 //如果能求出来 一般是不存在负权回路 //如果有负回路 那最小距离可能是负无穷 #include <cstring> #include <iostream ...
- poj1860 bellman—ford队列优化 Currency Exchange
Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 22123 Accepted: 799 ...
- uva 558 - Wormholes(Bellman Ford判断负环)
题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...
随机推荐
- @play.data.binding.NoBinding
新的@play.data.binding.NoBinding注解允许我们定义一些"不应该被绑定"的字段,以防出现安全问题.例如: public class User extends ...
- 2021羊城杯比赛复现(Crypto)
bigrsa 题目: from Crypto.Util.number import * from flag import * n1 = 10383529640908175186077053551474 ...
- python解释器的安装以及解释器多版本共存
版本介绍 python创始人:gukido(龟叔) python1.X 原始版本,几乎不用 python2.x 最高版本2.7(2020年之后不再维护) python3.x 最高版本3.9(一般用3. ...
- mysq数据库相信介绍大纲!!!!!!
什么是数据库? 数据库(Database)是按照数据结构来安排.存储和办理数据的仓库. 每个数据库都有一个或多个不同的 API 用于创立,访问,办理,搜索和仿制所保存的数据. 我们也能够将数据存储在文 ...
- 数据分析实际案例之:pandas在泰坦尼特号乘客数据中的使用
目录 简介 泰坦尼特号乘客数据 使用pandas对数据进行分析 引入依赖包 读取和分析数据 图形化表示和矩阵转换 简介 1912年4月15日,号称永不沉没的泰坦尼克号因为和冰山相撞沉没了.因为没有足够 ...
- java操作excel(通过POI)
读取所有数据,并打印出来,表单名:testcase 定义实体类(说明:这里单纯打印读取的excel内容,未用到实体类,反射的时候才会用到实体类) package com.qzcsbj; /** * @ ...
- Burp suite基本配置介绍
实验目的 利用Burp Spider功能探测目标网站的目录结构. 实验原理 1)Burp Suite是Web应用程序测试的最佳工具之一,其多种功能可以帮我们执行各种任务.请求的拦截和修改,扫描web应 ...
- python基础之数值类型与序列类型
Hello大家好,我是python学习者小杨同学,已经学习python有一段时间,今天将之前学习过的内容整理一番,在这与大家分享与交流,现在开始我们的python基础知识之旅吧. 数值类型与序列类型 ...
- SVG小图片格式显示(字符图标,可设置title属性)
1.HTML + Font 方式: 修改图标颜色只需修改字体颜色,修改图片大小只需修改字体大小. 关于字体图片,我们可以自己制作,也可以从网上下载 阿里巴巴矢量图库. 在线图标字体库.Icomoon. ...
- 常用邮箱POP3和SMTP服务器 设置
转至:https://blog.csdn.net/zjfei/article/details/4757424?spm=1001.2101.3001.6661.1&utm_medium=dist ...