112 lines
4.6 KiB
Java
112 lines
4.6 KiB
Java
|
/*This Java program is to Implement Bellman-Ford algorithm.The Bellman–Ford algorithm is an algorithm that computes shortest paths from a single source vertex to all of the other vertices in a weighted digraph.It is capable of handling graphs in which some of the edge weights are negative numbers.*/
|
|||
|
|
|||
|
import java.util.Scanner;
|
|||
|
|
|||
|
public class BellmanFord
|
|||
|
{
|
|||
|
private int distances[];
|
|||
|
private int numberofvertices;
|
|||
|
public static final int MAX_VALUE = 999;
|
|||
|
|
|||
|
public BellmanFord(int numberofvertices)
|
|||
|
{
|
|||
|
this.numberofvertices = numberofvertices;
|
|||
|
distances = new int[numberofvertices + 1];
|
|||
|
}
|
|||
|
|
|||
|
public void BellmanFordEvaluation(int source, int adjacencymatrix[][])
|
|||
|
{
|
|||
|
for (int node = 1; node <= numberofvertices; node++)
|
|||
|
{
|
|||
|
distances[node] = MAX_VALUE;
|
|||
|
}
|
|||
|
distances[source] = 0;
|
|||
|
for (int node = 1; node <= numberofvertices - 1; node++)
|
|||
|
{
|
|||
|
for (int sourcenode = 1; sourcenode <= numberofvertices; sourcenode++)
|
|||
|
{
|
|||
|
for (int destinationnode = 1; destinationnode <= numberofvertices; destinationnode++)
|
|||
|
{
|
|||
|
if (adjacencymatrix[sourcenode][destinationnode] != MAX_VALUE)
|
|||
|
{
|
|||
|
if (distances[destinationnode] > distances[sourcenode]
|
|||
|
+ adjacencymatrix[sourcenode][destinationnode])
|
|||
|
distances[destinationnode] = distances[sourcenode]
|
|||
|
+ adjacencymatrix[sourcenode][destinationnode];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
for (int sourcenode = 1; sourcenode <= numberofvertices; sourcenode++)
|
|||
|
{
|
|||
|
for (int destinationnode = 1; destinationnode <= numberofvertices; destinationnode++)
|
|||
|
{
|
|||
|
if (adjacencymatrix[sourcenode][destinationnode] != MAX_VALUE)
|
|||
|
{
|
|||
|
if (distances[destinationnode] > distances[sourcenode]
|
|||
|
+ adjacencymatrix[sourcenode][destinationnode])
|
|||
|
System.out.println("The Graph contains negative egde cycle");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
for (int vertex = 1; vertex <= numberofvertices; vertex++)
|
|||
|
{
|
|||
|
System.out.println("distance of source " + source + " to "
|
|||
|
+ vertex + " is " + distances[vertex]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public static void main(String... arg)
|
|||
|
{
|
|||
|
int numberofvertices = 0;
|
|||
|
int source;
|
|||
|
Scanner scanner = new Scanner(System.in);
|
|||
|
System.out.println("Enter the number of vertices");
|
|||
|
numberofvertices = scanner.nextInt();
|
|||
|
int adjacencymatrix[][] = new int[numberofvertices + 1][numberofvertices + 1];
|
|||
|
System.out.println("Enter the adjacency matrix");
|
|||
|
for (int sourcenode = 1; sourcenode <= numberofvertices; sourcenode++)
|
|||
|
{
|
|||
|
for (int destinationnode = 1; destinationnode <= numberofvertices; destinationnode++)
|
|||
|
{
|
|||
|
adjacencymatrix[sourcenode][destinationnode] = scanner.nextInt();
|
|||
|
if (sourcenode == destinationnode)
|
|||
|
{
|
|||
|
adjacencymatrix[sourcenode][destinationnode] = 0;
|
|||
|
continue;
|
|||
|
}
|
|||
|
if (adjacencymatrix[sourcenode][destinationnode] == 0)
|
|||
|
{
|
|||
|
adjacencymatrix[sourcenode][destinationnode] = MAX_VALUE;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
System.out.println("Enter the source vertex");
|
|||
|
source = scanner.nextInt();
|
|||
|
BellmanFord bellmanford = new BellmanFord(numberofvertices);
|
|||
|
bellmanford.BellmanFordEvaluation(source, adjacencymatrix);
|
|||
|
scanner.close();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
|
|||
|
Enter the number of vertices
|
|||
|
6
|
|||
|
Enter the adjacency matrix
|
|||
|
0 4 0 0 -1 0
|
|||
|
0 0 -1 0 -2 0
|
|||
|
0 0 0 0 0 0
|
|||
|
0 0 0 0 0 0
|
|||
|
0 0 0 -5 0 3
|
|||
|
0 0 0 0 0 0
|
|||
|
|
|||
|
Enter the source vertex
|
|||
|
1
|
|||
|
|
|||
|
distance of source 1 to 1 is 0
|
|||
|
distance of source 1 to 2 is 4
|
|||
|
distance of source 1 to 3 is 3
|
|||
|
distance of source 1 to 4 is -6
|
|||
|
distance of source 1 to 5 is -1
|
|||
|
distance of source 1 to 6 is 2
|