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次松弛时,还能 ... 
随机推荐
- 微信小程序开发提升效率
			http://www.ifanr.com/minapp/790017 微信小程序的 API 实现需要兼顾方方面面,所以仍然使用 callback 写法. 众所周知,Callback-Hell(回调地狱 ... 
- 服务器硬件及RAID配置实践
			服务器硬件及RAID配置实践 1.RAID磁盘阵列介绍 2.创建RAID磁盘阵列 1.RAID:中文简称为独立冗余磁盘阵列 把多块独立的物理硬盘按不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供 ... 
- 有手就行5——jenkins项目构建类型(pipeline流水线项目构建推荐)
			有手就行5--jenkins项目构建类型(pipeline流水线项目构建推荐) Pipeline简介 1) 概念 Pipeline,简单来说,就是一套运行在 Jenkins 上的工作流框架,将原来独立 ... 
- Node介绍
			https://segmentfault.com/a/1190000006121183 一. 概述 Node.js是基于Chrome JavaScript运行时建立的一个平台,实际上它是对Google ... 
- 期中架构&防火墙¥四表五链
			今日内容 架构图 包过滤防火墙 Iptables 新建虚拟机 内容详细 一.架构图 用户通过域名访问一个网站类比开车去饭店用餐 访问网站的流程 1.浏览器输入网站的域名(www.baidu.com), ... 
- Solution -「CF 1491H」Yuezheng Ling and Dynamic Tree
			\(\mathcal{Description}\) Link. 做题原因:题目名. 给定一个长度 \(n-1\) 的序列 \(\{a_2,a_3,\cdots,a_n\}\),其描述了一棵 \ ... 
- uniapp 微信发送订阅消息
			这篇主要针对小程序进行演示,既然是发送消息,那么就有三个问题.发送什么内容,给谁发送,怎么发送!往下一条一条解决. 发送什么消息内容 - 通过微信公众号平台 选择对应的消息模板 选择以后在我的模板里面 ... 
- elk监听Java日志发送微信报警
			一年前写过logstash根据日志关键词报警 ,今年重温一下.并且记录一下遇到的问题解决办法. Java错误日志一般出现一大坨,如下图: 所以我们的filebeat日志收集器就要改成多行匹配模式,以日 ... 
- linux服务器登录微信报警通知
			linux服务器ssh登录安全规则中,理论上要做到:防火墙限制,hosts.allow限制,root禁止登录,用户权限分配,ssh端口修改,登录时间限制,堡垒机登录. 这里只讲登录时间限制和登录报警通 ... 
- [虚拟化]虚拟机 XML 配置
			虚拟机 XML 配置示例 虚拟机的 XML 配置(也称为 域 XML )决定虚拟机的设置和组件.下表显示了虚拟机(VM)的 XML 配置示例并解释了其内容. 要获取虚拟机的 XML 配置,您可以使用 ... 
