| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
 | | package com.doumee.core.utils; |  |   |  | import java.util.HashMap; |  | import java.util.LinkedList; |  | import java.util.Queue; |  |   |  | public class DijkstraUtil { |  |     private Queue visited; |  |     int[] distance; |  |   |  |     public DijkstraUtil(int len) { |  |         // TODO Auto-generated constructor stub |  |         visited = new LinkedList(); |  |         distance = new int[len]; |  |   |  |     } |  |   |  |     private int getIndex(Queue q, int[] dis) { |  |         int k = -1; |  |         int min_num = Integer.MAX_VALUE; |  |         for (int i = 0; i < dis.length; i++) { |  |             if (!q.contains(i)) { |  |                 if (dis[i] < min_num) { |  |                     min_num = dis[i]; |  |                     k = i; |  |                 } |  |             } |  |         } |  |         return k; |  |     } |  |   |  |     public void dijkstra(int[][] weight, Object[] str, int v) { |  |         HashMap path; |  |         path = new HashMap(); |  |         for (int i = 0; i < str.length; i++) |  |             path.put(i, ""); |  |   |  |         //初始化路径长度数组distance |  |         for (int i = 0; i < str.length; i++) { |  |             path.put(i, path.get(i) + "" + str[v]); |  |             if (i == v) |  |                 distance[i] = 0; |  |             else if (weight[v][i] != -1) { |  |                 distance[i] = weight[v][i]; |  |                 path.put(i, path.get(i) + "-->" + str[i]); |  |             } else |  |                 distance[i] = Integer.MAX_VALUE; |  |         } |  |         visited.add(v); |  |         while (visited.size() < str.length) { |  |             int k = getIndex(visited, distance);//获取未访问点中距离源点最近的点 |  |             visited.add(k); |  |             if (k != -1) { |  |   |  |                 for (int j = 0; j < str.length; j++) { |  |                     //判断k点能够直接到达的点 |  |                     if (weight[k][j] != -1) { |  |                         //通过遍历各点,比较是否有比当前更短的路径,有的话,则更新distance,并更新path。 |  |                         if (distance[j] > distance[k] + weight[k][j]) { |  |                             distance[j] = distance[k] + weight[k][j]; |  |                             path.put(j, path.get(k) + "-->" + str[j]); |  |                         } |  |                     } |  |   |  |                 } |  |             } |  |         } |  |         for (int h = 0; h < str.length; h++) { |  |             System.out.printf(str[v] + "-->" + str[h] + ":" + distance[h] + " "); |  |             if (distance[h] == Integer.MAX_VALUE) |  |                 System.out.print(str[v] + "-->" + str[h] + "之间没有可通行路径"); |  |             else |  |                 System.out.print(str[v] + "-" + str[h] + "之间有最短路径,具体路径为:" + path.get(h).toString()); |  |             System.out.println(); |  |         } |  |         visited.clear(); |  |   |  |     } |  |   |  |     public static void main(String[] args) { |  |         // TODO Auto-generated method stub |  |        /* int[][] weight = { |  |                 {0, 10, 12, -1, -1, -1}, |  |                 {-1, 0, -1, 16, 25, -1}, |  |                 {4, 3, 0, 12, -1, 8}, |  |                 {-1, -1, -1, 0, 7, -1}, |  |                 {-1, -1, -1, -1, 0, -1}, |  |                 {-1, -1, -1, 2, -1, 0}}; |  |         String[] str = {"V1", "V2", "V3", "V4", "V5", "V6"}; |  |         int len = str.length; |  |         DijkstraUtil dijkstra = new DijkstraUtil(len); |  |         //依次让各点当源点,并调用dijkstra函数 |  |         for (int i = 0; i < str.length; i++) { |  |             dijkstra.dijkstra(weight, str, i); |  |         }*/ |  |   |  |         int[][] weight = { |  |                 {0, 10, 5, 7, -1}, |  |                 {-1, 0, 4, 5, 10}, |  |                 {-1, 4, 0, 6, 5}, |  |                 {-1, 5, 6, 0, 7}, |  |                 {-1, -1, -1, -1, 0}}; |  |         String[] str = {"A", "B", "C", "D", "E"}; |  |         DijkstraUtil dijkstra = new DijkstraUtil(str.length); |  |         dijkstra.dijkstra(weight, str, 0); |  |     } |  |   |  | } | 
 |