当我们使用BellmanFord算法时可以了解到,当我们第一次遍历时松弛的边是从源点可以直接到达的边,接着再从这些顶点可以直接到达的边进行松弛,以此类推。
所以基于以上思想我们可以去除BellmanFord算法中的无效循环。

首先我们可以选择使用连个数组first和next,first用于记录每条边的第一条边(最后一次输入的边),next用于记录每条边的上一条边,如果没有上一条边则next为-1。再使用que数组(队列)存放已经松弛过的顶点,book数组用来记录顶点是否已经入队。首先,我们需要先把源点入队,且记录下源点已经入队。我们默认从源点到其他所有顶点的距离为999(无穷大)。我们从源点开始找出其第一条出边(1->5 10)接下来的判断就和BellmanFord中一样,松弛该边成功,顶点5入队。接着找出源点开始的第二条边(1->2 2),松弛成功,将2号顶点入队。此时我们发现从源点开始可以直接到达的顶点都没有了,然后我们把源点出队,从队列中的第二个顶点(5)开始向下搜索其可直接到达的边进行松弛,以此类推,直到队列中没有顶点为止。

int[] u = new int[7];
int[] v = new int[7];
int[] w = new int[7];int[] first = new int[5];//顶点个数
int[] next = new int[7];//边的条数int[] dis = new int[5];//原点到各个点之间的距离int[] book = new int[5];int head = 0;
int tail = 1;
int[] que = new int[20];private void initArrs() {for (int i = 1; i <= 4; i++) {dis[i] = 999;}for (int i = 0; i <= 4; i++) {first[i] = -1;}u[0] = 0;v[0] = 1;w[0] = 2;u[1] = 0;v[1] = 4;w[1] = 10;u[2] = 1;v[2] = 2;w[2] = 3;u[3] = 1;v[3] = 4;w[3] = 7;u[4] = 2;v[4] = 3;w[4] = 4;u[5] = 3;v[5] = 4;w[5] = 5;u[6] = 4;v[6] = 3;w[6] = 6;for (int i = 0; i <= 6; i++) {next[i] = first[u[i]];first[u[i]] = i;}
}@Test
public void testBellmanFordBetter() {initArrs();book[0] = 1;que[0] = 0;while (head < tail) {int k = first[que[head]];while (k != -1) {if (dis[v[k]] > dis[u[k]] + w[k]) {dis[v[k]] = dis[u[k]] + w[k];if (book[v[k]] == 0) {que[tail++] = v[k];book[v[k]] = 1;}}k = next[k];}book[que[head]] = 0;head++;}for (int i = 0; i <= 4; i++) {System.out.println(dis[i]);}
}

转载于:https://www.cnblogs.com/javathinker/p/7862202.html

BellmanFord的队列优化相关推荐

  1. ~~spfa 算法(队列优化的Bellman-Ford算法)(附模板题)

    1.SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA一般情况复杂度是O(m) 最坏情况下复杂度和朴素 Bellman-Fo ...

  2. SPFA求最短路——Bellman-Ford算法的优化

    SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA 最坏情况下复杂度和朴素 Bellman-Ford 相同,为 O(VE), ...

  3. 算法笔记--单调队列优化dp

    单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...

  4. 多重背包单调队列优化思路_多重背包之单调队列优化理论性总结

    多重背包之单调队列优化: 若用F[j]表示对容量为j的背包,处理完前i种物品后,背包内物品可达到的最大总价值,并记m = min(n, j / v).放入背包的第i种物品的数目可以是:0.1.2--, ...

  5. tyvj1305 最大子序和 【单调队列优化dp】

    描述 输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大. 例如 1,-3,5,1,-2,3 当m=4时,S=5+1-2+3=7 当m=2或m=3时,S=5+1=6 输 ...

  6. poj 2373(单调队列优化dp)

    在长为L(<=1000000)的草地(可看成线段)上装喷水头,喷射是以这个喷水头为中心,喷水头的喷洒半径是可调节的调节范围为[a,b].要求草地的每个点被且只被一个喷水头覆盖,并且有些连续区间必 ...

  7. poj 1821(单调队列优化dp)

    题意:有一道线性篱笆由N个连续的木板组成.有K个工人,你要叫他们给木板涂色.每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以得到 ...

  8. hdu 3401(单调队列优化dp)

    注意:这题题意是有操作的天数相隔要大于w 然后列出状态转移方程就可以发现,可以用优点队列优化啦. 构造状态dp[i][j]表示第i 天拥有 j只股票的时候,赚了多少钱 状态转移有: 1.从前一天不买不 ...

  9. POJ - 3926 Parade(单调队列优化dp)

    题目链接:点击查看 题目大意:给出一个n*m的街道,其中有(n+1)*m条街道,每条街道都有一个值,现在我们需要从最下面的任意一点出发,到达最上面的任意一点结束,问如何规划路线能让沿途经过的街道的权值 ...

最新文章

  1. 浏览器对象模型:window对象2
  2. Vector 把一个vector追加到另一个vector
  3. 学好Java开发的关键七步
  4. python简单网络爬虫_【Python】 简单网络爬虫实现
  5. 为什么那么多自学WEB前端的人后来都放弃了?
  6. 运维人员需重视非技术能力(老鸟经验分享)
  7. 拓端tecdat|R语言广义相加模型 (GAMs)分析预测CO2时间序列数据
  8. WordPress简约mkBlog博客主题模板v2.1
  9. excel导出时报错 “文件格式和扩展名不匹配,文件可能已损坏或不安全”解决办法
  10. 利用R绘制venn图(VennDiagram、eulerr、venneuler、limma)
  11. python自动生成word报告_利用Python实现报告自动生成
  12. AI 入门怎么学?这份学习指南请收好!
  13. 解决Error: ENOENT: no such file or directory, scandir 安装node-sass报错
  14. pta 试试手气 C语言
  15. SOCKET的 10035错误
  16. 三星手机虚拟定位服务器,三星量产企业服务器用3.2TB NVMe SSD
  17. 快速搜索匹配联系人算法
  18. lightroom最新版本下载_277手游盒子最新版本下载(完美世界)
  19. GROM操作mysql数据库
  20. 智慧工厂用到的技术_智慧工厂需要解决哪些问题及技术实现?

热门文章

  1. linux中rpm命令管理
  2. 使用 Node.js、Express、AngularJS 和 MongoDB 构建一个Web程序
  3. Objective-C:三种文件导入的方式以及atomic和nonatomic的区别
  4. Hbase 学习(六) 配置文件调优
  5. jQuery.extend与jQuery.fn.extend的区别
  6. Class Activation Mapping (CNN可视化) Python示例
  7. 概览屏幕(最新动态屏幕、最近任务列表)
  8. Java键盘交互设计输入法,输入法中暖心的交互细节
  9. uni-app 修改富文本信息中的图片样式
  10. 配置 postCSS 自动添加 css 的兼容前缀||打包样式表中的图片和字体文件||打包处理 js 文件中的高级语法