/
NikolayIvkin
/
TheAlgorithms
Обзор
Документация
Войти
/
NikolayIvkin
/
TheAlgorithms
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/main/java/com/thealgorithms/datastructures/graphs/FloydWarshall.java
85 строк
4 KB
Strange Developer
General performance improvement (#6078)
01 ноя 2024, 20:52
Не верифицирован
01 ноя 2024, 20:52
df0c997
Код
Авторство
О чём код?
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; } }