1 package iYou.neugle.graph;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 //创建图过程的代码在图的那篇博文中,此处直接使用
7 public class Dijkstra {
8 private MyGraph1 graph;
9 private int start;
10 private int maxNum;
11 private int[] distance;// 起始点到终点距离
12 private int[] point;// 除起始点的其他点的集合
13 private String[] path;// 起始点到终点的路径
14 private List<Integer> s = new ArrayList<Integer>();// 点的集合
15
16 public Dijkstra(MyGraph1 graph, int start) {
17 this.graph = graph;
18 this.start = start - 1;
19 this.maxNum = this.graph.getGraph().maxNum;
20 distance = new int[this.maxNum - 1];
21 point = new int[this.maxNum - 1];
22 path = new String[this.maxNum - 1];
23 }
24
25 // 初始化最小距离数组
26 private void Init() {
27 for (int i = 0; i < this.maxNum - 1; i++) {
28 this.distance[i] = Integer.MAX_VALUE;
29 if (i >= this.start) {
30 this.point[i] = i + 1;
31 } else {
32 this.point[i] = i;
33 }
34 }
35 }
36
37 public void DijkstraCore() {
38 this.Init();
39 // 首先将起始节点加入到集合s中
40 this.s.add(this.start);
41 // 初始化中间节点u
42 int u = this.start;
43 // 若果s集合达到maxNum则终止
44 while (s.size() < this.maxNum) {
45 int[][] edges = this.graph.getGraph().edge;
46 boolean b = false;
47 for (int i = 0; i < edges[u].length; i++) {
48 // 如果开始节点和中间节点不连通则不进行任何操作(排除开始节点)
49 if (edges[this.start][u] == 0 && u != this.start) {
50 break;
51 }
52 // 节点到起始点的距离是不用求的
53 if (i == this.start) {
54 b = true;
55 continue;
56 }
57 int x;
58 // 如果在起始节点之后的节点需要i--
59 if (b == false) {
60 x = i;
61 } else {
62 x = i - 1;
63 }
64 // 如果有路径则计算
65 if (edges[u][i] != 0) {
66 int temp = edges[this.start][u] + edges[u][i];
67 if (temp < this.distance[x]) {
68 this.distance[x] = temp;
69 if (this.start == u) {
70 this.path[x] = (this.start + 1) + "->" + (i + 1);
71 } else {
72 this.path[x] = (this.start + 1) + "->" + (u + 1)
73 + "->" + (i + 1);
74 }
75 }
76 }
77 }
78 // 找到下一次的中间节点
79 u = this.Function();
80 // 将中间点加入到集合s中
81 this.s.add(u);
82 }
83 this.Print();
84 }
85
86 // 功能函数:找到此时distance数组中的最小值(最小值的条件是不在s中的最小值)
87 private int Function() {
88 int u = Integer.MAX_VALUE;
89 int k = -1;
90 for (int i = 0; i < this.distance.length; i++) {
91 // 如果在s中存在该节点则继续找其他次小的节点
92 if (this.s.contains(this.point[i])) {
93 continue;
94 } else {
95 if (this.distance[i] < u) {
96 u = this.distance[i];
97 k = this.point[i];
98 }
99 }
100 }
101 return k;
102 }
103
104 // 打印结果
105 private void Print() {
106 for (int i = 0; i < this.distance.length; i++) {
107 System.out.println(this.path[i] + ":" + this.distance[i]);
108 }
109 }
110
111 public static void main(String[] args) {
112 MyGraph1 graph = new MyGraph1(5, 0);
113 graph.CreateMaxtrixGraph(1, 2, 2);
114 graph.CreateMaxtrixGraph(1, 3, 5);
115 graph.CreateMaxtrixGraph(1, 5, 3);
116 graph.CreateMaxtrixGraph(2, 4, 4);
117 graph.CreateMaxtrixGraph(3, 5, 5);
118 graph.CreateMaxtrixGraph(4, 5, 2);
119 graph.OutPutMaxtrixGraph();
120 Dijkstra dijkstra = new Dijkstra(graph, 2);
121 dijkstra.DijkstraCore();
122 }
123 }
1 2 3 4 5
1 0 2 5 0 3
2 2 0 0 4 0
3 5 0 0 0 5
4 0 4 0 0 2
5 3 0 5 2 0
2->1:2
2->1->3:7
2->4:4
2->1->5:5