Skip to content

Commit 55b33fd

Browse files
committed
Add Dijkstra's algorithm
1 parent 0a6ce62 commit 55b33fd

File tree

1 file changed

+131
-0
lines changed
  • src/main/java/com/packt/datastructuresandalg/lesson6/dijkstra

1 file changed

+131
-0
lines changed
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package com.packt.datastructuresandalg.lesson6.dijkstra;
2+
3+
import java.lang.reflect.Array;
4+
import java.util.ArrayList;
5+
import java.util.HashSet;
6+
import java.util.List;
7+
import java.util.Set;
8+
9+
public class Dijkstra {
10+
private class Edge {
11+
int v;
12+
int weight;
13+
14+
Edge(int v, int weight) {
15+
this.v = v;
16+
this.weight = weight;
17+
}
18+
}
19+
20+
private class Vertex {
21+
int u;
22+
int distance;
23+
24+
Vertex(int u, int distance) {
25+
this.distance = distance;
26+
this.u = u;
27+
}
28+
}
29+
30+
public class Path {
31+
int from;
32+
int to;
33+
int distance;
34+
List<Integer> path;
35+
36+
Path(int from, int to, int distance, List<Integer> path) {
37+
this.from = from;
38+
this.to = to;
39+
this.distance = distance;
40+
this.path = path;
41+
}
42+
}
43+
44+
List<Edge> adj[];
45+
46+
public Dijkstra(int nodes) {
47+
this.adj = new ArrayList[nodes];
48+
for (int i = 0; i < nodes; i++)
49+
this.adj[i] = new ArrayList<>();
50+
}
51+
52+
public void addEdge(int u, int v, int weight) {
53+
adj[u].add(new Edge(v, weight));
54+
}
55+
56+
private Vertex getBestEstimate(Set<Vertex> vertices) {
57+
Vertex best = null;
58+
for (Vertex v : vertices) {
59+
if (best == null || v.distance < best.distance)
60+
best = v;
61+
}
62+
return best;
63+
}
64+
65+
public Path[] dijkstra(int source) {
66+
Set<Vertex> notVisited = new HashSet<>();
67+
Set<Vertex> visited = new HashSet<>();
68+
Vertex vertices[] = new Vertex[adj.length];
69+
int parent[] = new int[adj.length];
70+
for (int i = 0; i < adj.length; i++) {
71+
Vertex v = new Vertex(i, Integer.MAX_VALUE);
72+
vertices[i] = v;
73+
parent[i] = -1;
74+
notVisited.add(v);
75+
}
76+
77+
vertices[source].distance = 0;
78+
while (!notVisited.isEmpty()) {
79+
Vertex v = getBestEstimate(notVisited);
80+
notVisited.remove(v);
81+
visited.add(v);
82+
for (Edge e : adj[v.u]) {
83+
if (!visited.contains(e.v)) {
84+
Vertex next = vertices[e.v];
85+
if (v.distance + e.weight < next.distance) {
86+
next.distance = v.distance + e.weight;
87+
parent[next.u] = v.u;
88+
}
89+
}
90+
}
91+
}
92+
93+
Path[] paths = new Path[adj.length];
94+
95+
for (int i = 0; i < adj.length; i++) {
96+
List<Integer> path = new ArrayList<>();
97+
Path p = new Path(source, i, vertices[i].distance, path);
98+
int j = i;
99+
while (parent[j] != -1) {
100+
path.add(0, j);
101+
j = parent[j];
102+
}
103+
paths[i] = p;
104+
}
105+
106+
return paths;
107+
}
108+
109+
public static void main(String [] args) {
110+
Dijkstra d = new Dijkstra(5);
111+
d.addEdge(0, 1, 10);
112+
d.addEdge(0, 3, 5);
113+
d.addEdge(1, 3, 2);
114+
d.addEdge(1, 2, 1);
115+
d.addEdge(2, 4, 4);
116+
d.addEdge(3, 1, 3);
117+
d.addEdge(3, 2, 9);
118+
d.addEdge(3, 4, 2);
119+
d.addEdge(4, 2, 6);
120+
121+
Path[] paths = d.dijkstra(0);
122+
for (int i = 0; i < paths.length; i++) {
123+
Path p = paths[i];
124+
System.out.print("Path from " + p.from + " to " + p.to + " (" + p.distance + ")");
125+
for (int j = 0; j < p.path.size(); j++) {
126+
System.out.print(" " + p.path.get(j));
127+
}
128+
System.out.println();
129+
}
130+
}
131+
}

0 commit comments

Comments
 (0)