1 问题描述
    何为Dijkstra算法?
    Dijkstra算法功能:给出加权连通图中一个顶点,称之为起点,找出起点到其它所有顶点之间的最短距离。
    Dijkstra算法思想:采用贪心法思想,进行n-1次查找(PS:n为加权连通图的顶点总个数,除去起点,则剩下n-1个顶点),第一次进行查找,找出距离起点最近的一个顶点,标记为已遍历;下一次进行查找时,从未被遍历中的顶点寻找距离起点最近的一个顶点, 标记为已遍历;直到n-1次查找完毕,结束查找,返回最终结果。

    2 解决方案
    迪杰斯特拉,最短路径 - 图1

    迪杰斯特拉,最短路径 - 图2
    3 题意
    例题: POJ_2387
    迪杰斯特拉算法的特点 :
    1.没有 负权值的图
    2.给定了起点和终点的图

    不进行点的标记,只进行权值的比较
    示例代码:

    1. package tuLun;
    2. import java.io.BufferedReader;
    3. import java.io.IOException;
    4. import java.io.InputStreamReader;
    5. import java.util.ArrayList;
    6. import java.util.Arrays;
    7. import java.util.PriorityQueue;
    8. import java.util.StringTokenizer;
    9. public class A_迪杰斯特拉_test {
    10. static int N,M;
    11. static ArrayList<ArrayList<int[]>> nodeArryList;
    12. static PriorityQueue<nodePoint> pQueue;
    13. static int[] pointDis; //记录到达当前节点的最大值
    14. static class nodePoint implements Comparable<nodePoint>{
    15. int getPoint;
    16. int vule;
    17. public nodePoint(int getPoint, int vule) {
    18. this.getPoint = getPoint;
    19. this.vule = vule;
    20. }
    21. //重写 compareTo 方法
    22. @Override
    23. public int compareTo(nodePoint o) {
    24. return this.vule == o.vule? this.getPoint-o.getPoint : this.vule -o.vule;
    25. }
    26. }
    27. public static void main(String[] args) throws IOException {
    28. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    29. StringTokenizer st = new StringTokenizer(br.readLine());
    30. N = Integer.parseInt(st.nextToken()); //边
    31. M = Integer.parseInt(st.nextToken()); //点
    32. nodeArryList = new ArrayList<ArrayList<int[]>>();
    33. for (int i = 0; i <= M; i++) {
    34. nodeArryList.add(new ArrayList<int[]>());
    35. }
    36. pointDis = new int[M+1];
    37. Arrays.fill(pointDis, Integer.MAX_VALUE);
    38. for (int i = 0; i < N; i++) {
    39. st = new StringTokenizer(br.readLine());
    40. int s = Integer.parseInt(st.nextToken());
    41. int e = Integer.parseInt(st.nextToken());
    42. int v = Integer.parseInt(st.nextToken());
    43. nodeArryList.get(s).add(new int[] {e,v});
    44. nodeArryList.get(e).add(new int[] {s,v});
    45. }
    46. getMinPath(1);
    47. System.out.println(pointDis[M]);
    48. }
    49. private static void getMinPath(int i) {
    50. pointDis[i] = 0; //第一节点的 dis 最小值 设置维0
    51. pQueue = new PriorityQueue<nodePoint>();
    52. pQueue.add(new nodePoint(i, 0)); //加入第一个节点, 高达的点为1,到达1节点,需要的权值设定为 0
    53. while(!pQueue.isEmpty()) {
    54. nodePoint tempNode = pQueue.poll();
    55. int getPoint = tempNode.getPoint;
    56. for (int j = 0; j < nodeArryList.get(getPoint).size(); j++) {
    57. int getPointTemp = nodeArryList.get(getPoint).get(j)[0];
    58. int getPointDis = pointDis[getPointTemp];
    59. int getValTemp = nodeArryList.get(getPoint).get(j)[1];
    60. //节点没有被访问过 ,并且当前节点的值(dis) + 下一个节点的权值 < 下一个点中记录的节点最小值(dis) ,因为时求最短路经
    61. if (getPointDis > getValTemp+pointDis[getPoint]) {
    62. pointDis[getPointTemp] = getValTemp+pointDis[getPoint];
    63. pQueue.add(new nodePoint(getPointTemp, getValTemp));
    64. }
    65. }
    66. }
    67. }
    68. }