Dijkstra Algorithm
Wed Nov 06 2024 18:48:39 GMT+0000 (Coordinated Universal Time)
Saved by @signup_returns
//DijkstraAlgorithm
import java.util.Scanner;
import java.util.Arrays;
public class DijkstraAlgorithm {
// Method to find the vertex with the minimum distance value that hasn't been processed yet
static int getMinDistanceVertex(int[] distance, boolean[] processedVertices, int numberOfVertices) {
int minDistance = Integer.MAX_VALUE; // Initialize with a large value
int minVertexIndex = -1; // Index of the vertex with the minimum distance
// Search for the vertex with the smallest distance value
for (int vertex = 0; vertex < numberOfVertices; vertex++) {
if (!processedVertices[vertex] && distance[vertex] <= minDistance) {
minDistance = distance[vertex]; // Update minimum distance
minVertexIndex = vertex; // Update index of vertex with minimum distance
}
}
return minVertexIndex;
}
// Method to implement Dijkstra's algorithm to find the shortest path from the source
static void dijkstra(int[][] graph, int[] distance, boolean[] processedVertices, int numberOfVertices, int sourceVertex) {
// Initialize distances and processedVertices
Arrays.fill(distance, Integer.MAX_VALUE); // Set all distances to infinity initially
Arrays.fill(processedVertices, false); // Mark all vertices as unprocessed
distance[sourceVertex] = 0; // Distance from source to itself is 0
// Find the shortest path for all vertices
for (int i = 0; i < numberOfVertices - 1; i++) {
// Get the vertex with the minimum distance value that hasn't been processed yet
int currentVertex = getMinDistanceVertex(distance, processedVertices, numberOfVertices);
// Mark the current vertex as processed
processedVertices[currentVertex] = true;
// Update distance values of adjacent vertices of the current vertex
for (int adjacentVertex = 0; adjacentVertex < numberOfVertices; adjacentVertex++) {
// If the adjacent vertex is unprocessed, has a path from currentVertex, and distance can be minimized
if (!processedVertices[adjacentVertex] && graph[currentVertex][adjacentVertex] != 0 &&
distance[currentVertex] != Integer.MAX_VALUE &&
distance[currentVertex] + graph[currentVertex][adjacentVertex] < distance[adjacentVertex]) {
// Update the distance to the adjacent vertex
distance[adjacentVertex] = distance[currentVertex] + graph[currentVertex][adjacentVertex];
}
}
}
}
// Method to print the solution (distances from source vertex)
static void printSolution(int[] distance, int numberOfVertices) {
System.out.println("Vertex Distance from Source");
for (int i = 0; i < numberOfVertices; i++) {
System.out.println(i + " \t\t " + distance[i]);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// Taking input for number of vertices
System.out.print("Enter the number of vertices: ");
int numberOfVertices = sc.nextInt();
// Initialize the graph matrix (adjacency matrix)
int[][] graph = new int[numberOfVertices][numberOfVertices];
// Taking input for the adjacency matrix (graph)
System.out.println("Enter the adjacency matrix (0 means no edge between vertices):");
for (int i = 0; i < numberOfVertices; i++) {
for (int j = 0; j < numberOfVertices; j++) {
graph[i][j] = sc.nextInt();
}
}
// Taking input for the source vertex
System.out.print("Enter the source vertex: ");
int sourceVertex = sc.nextInt();
// Arrays to store the distance and processed status of vertices
int[] distance = new int[numberOfVertices];
boolean[] processedVertices = new boolean[numberOfVertices];
// Run Dijkstra's algorithm starting from the source vertex
dijkstra(graph, distance, processedVertices, numberOfVertices, sourceVertex);
// Print the shortest distances from the source vertex
printSolution(distance, numberOfVertices);
}
}
/*
Test Case
Enter the number of vertices: 5
Enter the adjacency matrix (0 means no edge between vertices):
0 10 0 0 0
0 0 5 0 0
0 0 0 15 0
0 0 0 0 20
0 0 0 0 0
Enter the source vertex: 0
Vertex Distance from Source
0 0
1 10
2 15
3 30
4 50
*/



Comments