1. public class DijkstraSP {
    2. //索引代表顶点,值表示从顶点s到当前顶点的最短路径上的倒数第二个顶点
    3. private int[] edgeTo;
    4. //索引代表顶点,值从顶点s到当前顶点的最短路径的总权重
    5. private double[] distValue;
    6. //是否做了标记,加入树中
    7. private boolean[] marked;
    8. //构造方法
    9. //根据一副加权有向图G和顶点s,创建一个计算顶点为s的最短路径树对象
    10. public DijkstraSP(EdgeWeightedDigraph G, int topPoint) {
    11. int pointNum = G.V();
    12. System.out.println("pointNum: "+pointNum);
    13. if (topPoint>pointNum-1){
    14. throw new Error("超出范围");
    15. }
    16. //创建一个和图的顶点数一样大小数组,表示从顶点s到当前顶点的最短路径上的倒数第二个顶点
    17. this.edgeTo = new int[pointNum];
    18. Arrays.fill(edgeTo, -1); //初始化都没有,除了顶点
    19. edgeTo[topPoint] = topPoint;
    20. //创建一个和图的顶点数一样大小的double数组,表示权重,并且初始化数组中的内容为无穷大,无穷大即表示不存在这样的边
    21. this.distValue = new double[pointNum];
    22. Arrays.fill(distValue, Double.POSITIVE_INFINITY);
    23. distValue[topPoint] = 0.0; //到顶点自身的距离了为0
    24. //marked初始化
    25. this.marked = new boolean[G.V()];
    26. int minPoint = 0;
    27. for (int i = (topPoint + 1) % pointNum; i != topPoint; i = (i + 1) % pointNum) {
    28. double minDist = Double.POSITIVE_INFINITY;//每次要重置最小值
    29. //求出 distValue中最短的路径,即最小值
    30. for (int j = 0; j < pointNum; j++) {
    31. if (!marked[j]&&distValue[j]<minDist){
    32. minDist = distValue[j];
    33. minPoint = j;
    34. }
    35. }
    36. if (minDist == Double.POSITIVE_INFINITY){
    37. break;
    38. }
    39. marked[minPoint] = true;//将点加入树,标记
    40. //遍历他的邻接表,更新distValue,更新邻接表中顶点的上一个顶点为该顶点
    41. for (DirectedEdge e : G.adj(minPoint)){
    42. //获取边e的终点
    43. int w = e.to();
    44. if (!marked[w]&&minDist + e.weight()<distValue[w]){
    45. distValue[w] = minDist + e.weight();
    46. edgeTo[w] = minPoint;
    47. }
    48. }
    49. }
    50. }
    51. public double[] getDistValue(){
    52. return distValue;
    53. }
    54. public int[] getEdgeTo(){
    55. return edgeTo;
    56. }
    57. public boolean[] getMarked(){
    58. return marked;
    59. }
    60. //判断从顶点s到顶点v是否可达
    61. public boolean hasPathTo(int v){
    62. return distValue[v]<Double.POSITIVE_INFINITY;
    63. }
    64. }