最短路径算法也是常用的图算法,在网上看到了一份c的代码,写的很清楚,今天有空给写成java的了,就当练手了。另,算法导论362页详细介绍了Bellman-Ford算法,本来打算再写个Dijsktra算法的,可是今天比较赖,就写这一个算法吧。

  1. package path;
  2. import java.util.HashSet;
  3.  
  4. public class BellmanFord {
  5.  
  6. private int MAX = Integer.MAX_VALUE;
  7. private int N = 1024;
  8. //顶点数 , 边数 , 起点
  9. private int nodenum, edgenum, original;
  10. //图的边
  11. private Edge [] edge = new Edge[N];
  12. //保存距离
  13. private double [] dis = new double[N];
  14. private int [] pre = new int[N];
  15. /**
  16. * @function
  17. * @return
  18. */
  19. boolean calculate()
  20. {
  21. for(int i = 1; i <= nodenum; ++i) //初始化
  22. dis[i] = (i == original ? 0 : MAX);
  23. for(int i = 1; i <= nodenum - 1; ++i)
  24. for(int j = 1; j <= edgenum; ++j)
  25. //松弛
  26. if(dis[edge[j].v] > dis[edge[j].u] + edge[j].cost){
  27. dis[edge[j].v] = dis[edge[j].u] + edge[j].cost;
  28. pre[edge[j].v] = edge[j].u;
  29. }
  30. boolean flag = true;
  31. //判断是否含有负权回路
  32. for(int i = 1; i <= edgenum; ++i)
  33. if(dis[edge[i].v] > dis[edge[i].u] + edge[i].cost){
  34. flag = false;
  35. break;
  36. }
  37. return flag;
  38. }
  39.  
  40. void print_path(int root) //打印最短路的路径(反向)
  41. {
  42. while(root != pre[root]){ //前驱
  43. System.out.print(root + "-->");
  44. root = pre[root];
  45. }
  46. if(root == pre[root])
  47. System.out.print(root + "\n");
  48. }
  49.  
  50. public boolean init(Edge [] edges){
  51. try{
  52. nodenum = edgenum = 0;
  53. HashSet<Integer> vSet = new HashSet<Integer>();
  54. for(int i = 1 ; i < edges.length ; ++i){
  55. edgenum++;
  56. edge[i] = edges[i];
  57. vSet.add(edges[i].u);
  58. vSet.add(edges[i].v);
  59. }
  60. nodenum = vSet.size();
  61. return true;
  62. }catch(Exception e){
  63. e.printStackTrace();
  64. return false;
  65. }
  66. }
  67. private void calcShortestPath(int original){
  68. this.original = original;
  69. pre[original] = original;
  70. if(calculate())
  71. for(int i = 1; i <= nodenum; ++i){ //每个点最短路
  72. System.out.print(dis[i] + "\n");
  73. System.out.print("Path:");
  74. print_path(i);
  75. }
  76. else
  77. System.out.println("have negative circle\n");
  78.  
  79. }
  80. public static void main(String [] args)
  81. {
  82. BellmanFord bellman = new BellmanFord();
  83.  
  84. Edge [] edges = new Edge [7];
  85. edges[1] = new Edge(1 , 2 , 2);
  86. edges[2] = new Edge(1 , 3 , 5);
  87. edges[3] = new Edge(4 , 1 , 10);
  88. edges[4] = new Edge(2 , 4 , 4);
  89. edges[5] = new Edge(4 , 2 , 4);
  90. edges[6] = new Edge(3 , 4 , 2);
  91.  
  92. bellman.init(edges);
  93. bellman.calcShortestPath(1);
  94. }
  95.  
  96. }
  97.  
  98. class Edge //边
  99. { // u为边的前驱结点,v为后继结点(暂且用前驱、后继来说)
  100. int u, v;
  101. //边的权重
  102. double cost;
  103. public Edge(int u , int v , double cost){
  104. this.u = u;
  105. this.v = v;
  106. this.cost = cost;
  107. }
  108. }

  

最短路径BellmanFord , Dijsktra的更多相关文章

  1. 最短路径——Bellman-Ford算法以及SPFA算法

    说完dijkstra算法,有提到过朴素dij算法无法处理负权边的情况,这里就需要用到Bellman-Ford算法,抛弃贪心的想法,牺牲时间的基础上,换取负权有向图的处理正确. 单源最短路径 Bellm ...

  2. 单源最短路径—Bellman-Ford和Dijkstra算法

    Bellman-Ford算法:通过对边进行松弛操作来渐近地降低从源结点s到每个结点v的最短路径的估计值v.d,直到该估计值与实际的最短路径权重相同时为止.该算法主要是基于下面的定理: 设G=(V,E) ...

  3. 最短路径——Bellman-Ford算法

    一.相关定义 最短路径:求源点到某特定点的最短距离 特点:Bellman-Ford算法主要是针对有负权值的图,来判断该图中是否有负权回路或者存在最短路径的点 局限性:算法效率不高,不如SPFA算法 时 ...

  4. 求最短路径(Bellman-Ford算法与Dijkstra算法)

    前言 Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的.这时候,就需要使用其他的算法来求 ...

  5. 单源最短路径---Bellman-Ford算法

    传送门: Dijkstra Bellman-Ford SPFA Floyd 1.Dijkstra算法的局限性 像上图,如果用dijkstra算法的话就会出错,因为如果从1开始,第一步dist[2] = ...

  6. matlab练习程序(单源最短路径Bellman-Ford)

    该算法可以用来解决一般(边的权值为负)的单源最短路径问题,而dijkstra只能解决权值非负的情况. 此算法使用松弛技术,对每一个顶点,逐步减少源到该顶点的路径的估计值,直到达到最短的路径. 算法运算 ...

  7. 最短路径 bellman-ford

    初始化:将除源点外的所有顶点的最短距离估计值 d[v] ←+∞, d[s] ←0 迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其最短距离:(运行|v ...

  8. 最短路径之Dijsktra算法(python)

    定义: 起始位置:A 终止位置:F 持久集合:permanent = set() 暂时集合:temporary = set() 首先将起始位置A加入永久集合,并将A的距离设为0, 此时遍历A的邻接节点 ...

  9. 四大算法解决最短路径问题(Dijkstra+Bellman-ford+SPFA+Floyd)

    什么是最短路径问题? 简单来讲,就是用于计算一个节点到其他所有节点的最短路径. 单源最短路算法:已知起点,求到达其他点的最短路径. 常用算法:Dijkstra算法.Bellman-ford算法.SPF ...

随机推荐

  1. 1、android orm之greendao

    前提:最近写android项目,android自带数据库api有点复杂,于是偷懒用了greendao.greendao好处自己查,这里不赘述,但是零基础的的我用起来还是费了3天的功夫,取之于网络,特在 ...

  2. word检视意见导出(VBA)

    Private Sub CommandButton1_Click() 'Dim Cmt As Comment Dim excelApp As Object Dim xlsWbk, objWdApp A ...

  3. Java 7 中 NIO.2 的使用——第二节 元数据文件的属性

    如果你有很多疑问关于一个文件或目录,它是否是隐藏的,它的大小是多少,谁拥有它,你可以从元数据中得到这些信息.所谓的元数据,就是描述数据的数据. NIO.2组织了这些原数据的属性的概念,并提供了java ...

  4. PHP去除数组中重复数据的两个例子

    例一: <?php$input = array("a" => "green","", "red"," ...

  5. HDU 5446 Unknown Treasure Lucas+中国剩余定理

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5446 Unknown Treasure 问题描述 On the way to the next se ...

  6. WebServices中Xml的序列化

    一.定义序列化实体类 [System.Xml.Serialization.XmlRoot("Custome_Xml_Root_Name")] //自定义生成的Xml根目录名称 pu ...

  7. Linq中Select查询参数提取公共方法

    class Program { static void Main(string[] args) { var listTest1 = new List<Test1> { "}, & ...

  8. 【python】编码规范(转载)

    转自:http://www.cnblogs.com/itech/archive/2012/01/06/2314454.html 1 编码 >>所有的 Python 脚本文件都应在文件头标上 ...

  9. 推荐系统之LFM(二)

    对于一个用户来说,他们可能有不同的兴趣.就以作者举的豆瓣书单的例子来说,用户A会关注数学,历史,计算机方面的书,用户B喜欢机器学习,编程语言,离散数学方面的书, 用户C喜欢大师Knuth, Jiawe ...

  10. NYOJ-655 光棍的YY AC 分类: NYOJ 2013-12-29 19:24 224人阅读 评论(0) 收藏

    #include<stdio.h> #include<string.h> char str[210]; int max[210][52]={0}; int sum(int n, ...