forked from TheAlgorithms/Java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFloydWarshall.java
More file actions
85 lines (77 loc) · 3.71 KB
/
FloydWarshall.java
File metadata and controls
85 lines (77 loc) · 3.71 KB
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
package com.thealgorithms.datastructures.graphs;
/**
* The {@code FloydWarshall} class provides an implementation of the Floyd-Warshall algorithm
* to compute the shortest paths between all pairs of vertices in a weighted graph.
* It handles both positive and negative edge weights but does not support negative cycles.
* The algorithm is based on dynamic programming and runs in O(V^3) time complexity,
* where V is the number of vertices in the graph.
*
* <p>
* The distance matrix is updated iteratively to find the shortest distance between any two vertices
* by considering each vertex as an intermediate step.
* </p>
*
* Reference: <a href="https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm">Floyd-Warshall Algorithm</a>
*/
public class FloydWarshall {
private int[][] distanceMatrix;
private int numberofvertices;
public static final int INFINITY = 999;
/**
* Constructs a Floyd-Warshall instance for a graph with the given number of vertices.
* Initializes the distance matrix for the graph.
*
* @param numberofvertices The number of vertices in the graph.
*/
public FloydWarshall(int numberofvertices) {
distanceMatrix = new int[numberofvertices + 1][numberofvertices + 1];
// The matrix is initialized with 0's by default
this.numberofvertices = numberofvertices;
}
/**
* Executes the Floyd-Warshall algorithm to compute the shortest path between all pairs of vertices.
* It uses an adjacency matrix to calculate the distance matrix by considering each vertex as an intermediate point.
*
* @param adjacencyMatrix The weighted adjacency matrix representing the graph.
* A value of 0 means no direct edge between the vertices, except for diagonal elements which are 0 (distance to self).
*/
public void floydwarshall(int[][] adjacencyMatrix) {
// Initialize the distance matrix with the adjacency matrix.
for (int source = 1; source <= numberofvertices; source++) {
System.arraycopy(adjacencyMatrix[source], 1, distanceMatrix[source], 1, numberofvertices);
}
for (int intermediate = 1; intermediate <= numberofvertices; intermediate++) {
for (int source = 1; source <= numberofvertices; source++) {
for (int destination = 1; destination <= numberofvertices; destination++) {
// Update distance if a shorter path through the intermediate vertex exists.
if (distanceMatrix[source][intermediate] + distanceMatrix[intermediate][destination] < distanceMatrix[source][destination]) {
distanceMatrix[source][destination] = distanceMatrix[source][intermediate] + distanceMatrix[intermediate][destination];
}
}
}
}
printDistanceMatrix();
}
/**
* Prints the distance matrix representing the shortest paths between all pairs of vertices.
* The rows and columns correspond to the source and destination vertices.
*/
private void printDistanceMatrix() {
// Print header for vertices
for (int source = 1; source <= numberofvertices; source++) {
System.out.print("\t" + source);
}
System.out.println();
// Print the distance matrix
for (int source = 1; source <= numberofvertices; source++) {
System.out.print(source + "\t");
for (int destination = 1; destination <= numberofvertices; destination++) {
System.out.print(distanceMatrix[source][destination] + "\t");
}
System.out.println();
}
}
public Object[] getDistanceMatrix() {
return distanceMatrix;
}
}