【问题描述】

对于一个带负权值边的有向图,实现Bellman-Ford算法,求出从指定顶点s到其余顶点的最短路径,并判断图中是否存在负环。

  1. package org.xiu68.exp.exp10;
  2.  
  3. public class Exp10_1 {
  4.  
  5. public static void main(String[] args) {
  6. // TODO Auto-generated method stub
  7. int[][] edges=new int[][]{
  8. {0,10,0,4,1},
  9. {0,0,0,0,0},
  10. {0,-10,0,0,0},
  11. {0,0,0,0,0},
  12. {0,0,2,0,0}
  13. };
  14. MGraph m1=new MGraph(edges);
  15. System.out.println(m1.bellmanFord(0));
  16. }
  17.  
  18. }
  19.  
  20. class MGraph{
  21. private int[][] edges; //有向图边集
  22. private int vexNum; //顶点数目
  23. private int[] dist; //源点到该顶点的距离
  24. private int maxDistant; //表示距离无穷远
  25.  
  26. public MGraph(int[][] edges){
  27. this.edges=edges;
  28. this.vexNum=edges.length;
  29. this.dist=new int[vexNum];
  30. this.maxDistant=1000000;
  31. }
  32.  
  33. public boolean bellmanFord(int start){
  34. //初始化dist数组
  35. for(int i=0;i<vexNum;i++){
  36. dist[i]=maxDistant;
  37. }
  38. dist[start]=0;
  39.  
  40. for(int i=0;i<vexNum-1;i++){ //从源点到任何一个顶点的最短路径最多有n-1条边
  41. boolean flag=false; //记录在本次循环中从源点到某个顶点是否有更短的路径
  42. //遍历所有的边
  43. for(int j=0;j<vexNum;j++){
  44. for(int k=0;k<vexNum;k++){
  45. if(edges[j][k]!=0 && dist[k]>dist[j]+edges[j][k]){
  46. dist[k]=dist[j]+edges[j][k];
  47. flag=true;
  48. }
  49. }
  50. }
  51. if(flag==false) //已经求得所有顶点的最短路径
  52. break;
  53. }
  54.  
  55. //本次循环检测是否有负环存在
  56. //从源点到某个顶点有n条边,且路径更短,说明有负环存在
  57. for(int i=0;i<vexNum;i++){
  58. for(int j=0;j<vexNum;j++){
  59. if(edges[i][j]!=0 && dist[j]>dist[i]+edges[i][j])
  60. return false;
  61. }
  62. }
  63.  
  64. for(int i=0;i<vexNum;i++)
  65. System.out.println(i+":"+dist[i]);
  66. return true;
  67. }
  68. }

Expm 10_1 带负权值边的有向图中的最短路径问题的更多相关文章

  1. 图之单源Dijkstra算法、带负权值最短路径算法

    1.图类基本组成 存储在邻接表中的基本项 /** * Represents an edge in the graph * */ class Edge implements Comparable< ...

  2. poj 3259 Wormholes 判断负权值回路

    Wormholes Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u   Java ...

  3. 非负权值有向图上的单源最短路径算法之Dijkstra算法

    问题的提法是:给定一个没有负权值的有向图和其中一个点src作为源点(source),求从点src到其余个点的最短路径及路径长度.求解该问题的算法一般为Dijkstra算法. 假设图顶点个数为n,则针对 ...

  4. Wormholes 最短路判断有无负权值

    Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...

  5. SPFA 最短路 带负权边的---- 粗了解

    SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算. 算法大致流程是用一个队列来进行维护. 初始时将源加入队列 ...

  6. hdu 6201 transaction (最短路变形——带负权最长路)

    题意: 给定n个城市的货物买卖价格, 然后给定n-1条道路,每条路有不同的路费, 求出从某两个城市买卖一次的最大利润. 利润 = 卖价 - (买价 + 路费) 样例数据, 最近是从第一个点买入, 第4 ...

  7. SPFA 求带负权的单源最短路

    int spfa_bfs(int s) { ///s表示起点. queue <int> q; memset(d,0x3f,sizeof(d)); ///d数组中存下的就是最短路径(存在的话 ...

  8. HDU 6464.免费送气球-动态开点-权值线段树(序列中第first小至第second小的数值之和)(感觉就是只有一个状态的主席树) (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)

    免费送气球 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  9. Dijkstra算法为什么权值不能为负

    Dijkstra算法当中将节点分为已求得最短路径的集合(记为S)和未确定最短路径的个集合(记为U),归入S集合的节点的最短路径及其长度不再变更,如果边上的权值允许为负值,那么有可能出现当与S内某点(记 ...

随机推荐

  1. overlay网络隔离实验失败记录

    按照 https://www.cnblogs.com/CloudMan6/p/7341487.html进行操作,实验结果与老师文章中的正好相反,不同 overlay 网络中的主机可以通信,验证部分见下 ...

  2. UDP客户/服务器程序所用的套接字函数

  3. Pre-shared key

    Pre-shared key https://en.wikipedia.org/wiki/Pre-shared_key In cryptography, a pre-shared key (PSK) ...

  4. 十三、u-boot 调试-- NOR FLASH 支持

    13.1 问题现象 在烧写进去的u-boot 中 Flash 并没有显示实际大小,需要进行修改. 13.2 问题定位过程 13.2.1 关键字搜索 Flash: 此关键字在 Board_r.c (co ...

  5. 【LeetCode】108. Convert Sorted Array to Binary Search Tree

    Problem: Given an array where elements are sorted in ascending order, convert it to a height balance ...

  6. PHP实现流程管理功能

    核心逻辑:流程管理,在各种系统中扮演很重要的地位,可以把设定好的流程放入系统中,规定好几个节点,只要所有节点都通过,就可以通过. 建立四张数据库表: 1.我们首先做一个新建流程页面 flow.php, ...

  7. javascript给定了日期如何获得星期几

    1.这可以用JavaScript的Date对象的getDay方法.如:获取当天是星期几,则为:new Date().getDay();//返回0-6,0对应星期天,1-6对应星期一到星期六2.如果想给 ...

  8. 父div的透明度不影响子div透明度

    在设置div的透明度的时候如果设置了父div的透明度(opacity=0.8),那么子div的透明度也随着改变了,并且设置子div的透明度不起作用. 这种情况下可以使用rgba来设置父div的透明度: ...

  9. Python之进程 3 - 进程池和multiprocess.Poll

    一.为什么要有进程池? 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务.那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗 ...

  10. Java基础_0305:简单Java类

    简单Java类 简单Java类是一种在实际开发之中使用最多的类的定义形式,在简单Java类中包含有类.对象.构造方法.private封装等核心概念的使用,而对于简单Java类首先给出如下的基本开发要求 ...