最短路径实现-迪杰斯特拉算法-java实现


  
  
  1. /** * 最短路径算法:迪杰斯特拉(Dijkstra)算法
  2. *
  3. * @author timmy1
  4. *
  5. */
  6. public class ShortestPath {
  7. int[][] matrix;// 矩阵
  8. int MAX_VALUE = 65535;
  9. int size;
  10. /**
  11. * 迪杰斯特拉算法求最短路径:和普里姆算法思路差不多,默认初始化为第一行的顶点权值数组-》找打最短权值的顶点-》然后再以该顶点去遍历,判断最短的路径
  12. */
  13. private void dijkstra() {
  14. int[] shortPath = new int[size];
  15. boolean[] isgetPath = new boolean[size];
  16. int minPath;
  17. int minVertex = 0;// 找到的最短权值的顶点
  18. int sum = 0;
  19. // 初始化第一行顶点权值路径
  20. for (int i = 0; i < size; i++) {
  21. shortPath[i] = matrix[0][i];
  22. }
  23. isgetPath[0] = true;
  24. PrintUtil.print("从第0个顶点开始查找");
  25. for (int i = 1; i < size; i++) {
  26. minPath = MAX_VALUE;
  27. // 找到已知权值数组中最小的权值
  28. for (int j = 1; j < size; j++) {
  29. if (!isgetPath[j] && shortPath[j] < minPath) {
  30. minPath = shortPath[j];
  31. minVertex = j;
  32. }
  33. }
  34. sum+= minPath;
  35. PrintUtil.print("找到最短路径顶点:" + minVertex+" 权值为:"+minPath);
  36. isgetPath[minVertex] = true;
  37. for (int j = 1; j < size; j++) {
  38. // 根据找到的最端路径的顶点去遍历添加,最新路径
  39. if (!isgetPath[j] && (minPath + matrix[minVertex][j]) < shortPath[j]) {
  40. shortPath[j] = minPath + matrix[minVertex][j];
  41. }
  42. }
  43. }
  44. PrintUtil.print("---------最短路径为:"+sum);
  45. for (int j = 1; j < size; j++) {
  46. PrintUtil.print("找到V0到顶点V" + j + "的最短路径:"+shortPath[j]);
  47. }
  48. }
  49. private void createGraph(int index) {
  50. size = index;
  51. matrix = new int[index][index];
  52. int[] a0 = { 0, 1, 5, MAX_VALUE, MAX_VALUE, MAX_VALUE, MAX_VALUE, MAX_VALUE, MAX_VALUE };
  53. int[] a1 = { 1, 0, 3, 7, 5, MAX_VALUE, MAX_VALUE, MAX_VALUE, MAX_VALUE };
  54. int[] a2 = { 5, 3, 0, MAX_VALUE, 1, 7, MAX_VALUE, MAX_VALUE, MAX_VALUE };
  55. int[] a3 = { MAX_VALUE, 7, MAX_VALUE, 0, 2, MAX_VALUE, 3, MAX_VALUE, MAX_VALUE };
  56. int[] a4 = { MAX_VALUE, 5, 1, 2, 0, 3, 6, 9, MAX_VALUE };
  57. int[] a5 = { MAX_VALUE, MAX_VALUE, 7, MAX_VALUE, 3, 0, MAX_VALUE, 5, MAX_VALUE };
  58. int[] a6 = { MAX_VALUE, MAX_VALUE, MAX_VALUE, 3, 6, MAX_VALUE, 0, 2, 7 };
  59. int[] a7 = { MAX_VALUE, MAX_VALUE, MAX_VALUE, MAX_VALUE, 9, 5, 2, 0, 4 };
  60. int[] a8 = { MAX_VALUE, MAX_VALUE, MAX_VALUE, MAX_VALUE, MAX_VALUE, MAX_VALUE, 7, 4, 0 };
  61. matrix[0] = a0;
  62. matrix[1] = a1;
  63. matrix[2] = a2;
  64. matrix[3] = a3;
  65. matrix[4] = a4;
  66. matrix[5] = a5;
  67. matrix[6] = a6;
  68. matrix[7] = a7;
  69. matrix[8] = a8;
  70. }
  71. public static void main(String[] args) {
  72. ShortestPath shPath = new ShortestPath();
  73. shPath.createGraph(9);
  74. shPath.dijkstra();
  75. }
  76. }

结果打印:

从第0个顶点开始查找

找到最短路径顶点:1 权值为:1

找到最短路径顶点:2 权值为:4

找到最短路径顶点:4 权值为:5

找到最短路径顶点:3 权值为:7

找到最短路径顶点:5 权值为:8

找到最短路径顶点:6 权值为:10

找到最短路径顶点:7 权值为:12

找到最短路径顶点:8 权值为:16

---------最短路径为:63

找到V0到顶点V1的最短路径:1

找到V0到顶点V2的最短路径:4

找到V0到顶点V3的最短路径:7

找到V0到顶点V4的最短路径:5

找到V0到顶点V5的最短路径:8

找到V0到顶点V6的最短路径:10

找到V0到顶点V7的最短路径:12

找到V0到顶点V8的最短路径:16




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值